Acho difícil formular a pergunta com precisão, mas darei o meu melhor. Eu uso dwm
como meu gerenciador de janelas padrão edmenu
como meu iniciador de aplicativos. Eu quase não uso aplicativos GUI além do meu navegador. A maior parte do meu trabalho é feita diretamente na linha de comando. Além disso, sou um grande fã do minimalismo em relação a sistemas operacionais, aplicativos etc. Uma das ferramentas de que nunca me livrei foi o iniciador de aplicativos. Principalmente porque me falta uma compreensão precisa de como os ativadores de aplicativos funcionam / o que eles fazem. Até uma extensa pesquisa na Internet mostra apenas uma explicação vaga. O que eu quero fazer é me livrar do iniciador de aplicativos, porque, além de gerar o aplicativo, não tenho absolutamente nenhum uso para ele. Para fazer isso, eu realmente gostaria de saber como "corretamente" iniciar aplicativos a partir do shell. Por meio do qual o significado de "corretamente" pode ser aproximado por "como faria o iniciador de aplicativos".
Conheço as seguintes maneiras de gerar processos do shell:
exec /path/to/Program
substituir shell pelo comando especificado sem criar um novo processosh -c /path/to/Program
iniciar processo dependente do shell/path/to/Program
iniciar processo dependente do shell/path/to/Program 2>&1 &
processo independente do shell de lançamentonohup /path/to/Program &
inicie o processo independente do shell e redirecione a saída paranohup.out
Atualização 1: Eu posso ilustrar o que, por exemplo dmenu
, reconstruí-lo de chamadas repetidas para ps -efl
diferentes condições. Ele gera um novo shell /bin/bash
e, como filho desse shell, o aplicativo /path/to/Program
. Enquanto a criança estiver por perto, a concha estará por perto. (Como ele gerencia isso está além de mim ...) Por outro lado, se você emitir nohup /path/to/Program &
um shell /bin/bash
, o programa se tornará filho desse shell, mas se você sair desse shell, o pai do programa será o processo mais alto. Portanto, se o primeiro processo foi, por exemplo, /sbin/init verbose
e já foi PPID 1
, ele será o pai do programa. Aqui está o que eu tentei explicar usando um gráfico: chromium
foi lançado via dmenu
, firefox
foi lançado usando exec firefox & exit
:
systemd-+-acpid
|-bash---chromium-+-chrome-sandbox---chromium-+-chrome-sandbox---nacl_helper
| | `-chromium---5*[chromium-+-{Chrome_ChildIOT}]
| | |-{Compositor}]
| | |-{HTMLParserThrea}]
| | |-{OptimizingCompi}]
| | `-3*[{v8:SweeperThrea}]]
| |-chromium
| |-chromium-+-chromium
| | |-{Chrome_ChildIOT}
| | `-{Watchdog}
| |-{AudioThread}
| |-3*[{BrowserBlocking}]
| |-{BrowserWatchdog}
| |-5*[{CachePoolWorker}]
| |-{Chrome_CacheThr}
| |-{Chrome_DBThread}
| |-{Chrome_FileThre}
| |-{Chrome_FileUser}
| |-{Chrome_HistoryT}
| |-{Chrome_IOThread}
| |-{Chrome_ProcessL}
| |-{Chrome_SafeBrow}
| |-{CrShutdownDetec}
| |-{IndexedDB}
| |-{LevelDBEnv}
| |-{NSS SSL ThreadW}
| |-{NetworkChangeNo}
| |-2*[{Proxy resolver}]
| |-{WorkerPool/1201}
| |-{WorkerPool/2059}
| |-{WorkerPool/2579}
| |-{WorkerPool/2590}
| |-{WorkerPool/2592}
| |-{WorkerPool/2608}
| |-{WorkerPool/2973}
| |-{WorkerPool/2974}
| |-{chromium}
| |-{extension_crash}
| |-{gpu-process_cra}
| |-{handle-watcher-}
| |-{inotify_reader}
| |-{ppapi_crash_upl}
| `-{renderer_crash_}
|-2*[dbus-daemon]
|-dbus-launch
|-dhcpcd
|-firefox-+-4*[{Analysis Helper}]
| |-{Cache I/O}
| |-{Cache2 I/O}
| |-{Cert Verify}
| |-3*[{DOM Worker}]
| |-{Gecko_IOThread}
| |-{HTML5 Parser}
| |-{Hang Monitor}
| |-{Image Scaler}
| |-{JS GC Helper}
| |-{JS Watchdog}
| |-{Proxy R~olution}
| |-{Socket Thread}
| |-{Timer}
| |-{URL Classifier}
| |-{gmain}
| |-{localStorage DB}
| |-{mozStorage #1}
| |-{mozStorage #2}
| |-{mozStorage #3}
| |-{mozStorage #4}
| `-{mozStorage #5}
|-gpg-agent
|-login---bash---startx---xinit-+-Xorg.bin-+-xf86-video-inte
| | `-{Xorg.bin}
| `-dwm-+-dwmstatus
| `-xterm---bash-+-bash
| `-pstree
|-systemd---(sd-pam)
|-systemd-journal
|-systemd-logind
|-systemd-udevd
|-wpa_actiond
`-wpa_supplicant
Atualização 2: Acho que a pergunta também pode ser resumida em: Qual deve ser o pai de um processo? Por exemplo, deveria ser uma concha ou deveria ser o init
processo, ou seja, o processo com PID 1
?
init
- para qual a resposta pode ser ... talvez? depende de como / se você planeja conversar com ele, o init
que usa e onde estão os canais de dados. Em geral, essas coisas tendem a se resolver - init
é para isso. De qualquer forma, geralmente quando você daemon um processo init
. Ou, se você deseja controle do trabalho, shell atual.
dmenu
e ver como me dou bem com o que aprendi. Acho exec /path/to/Program & exit
ou /bin/bash -c /path/to/Program & exit
para ser bastante utilizável. Mas todos eles fazem, 1
ou seja, init
o pai do Program
que está bem comigo, desde que isso faça sentido e não viole nenhum *nix
princípio básico .
exec &
, eu acho. Normalmente faço minhas coisas no terminal ... talvez você se aproveite da pergunta de Ben Crowell aqui . Eu tenho uma resposta lá, mas todos eles são muito bons. de qualquer maneira, quando você sh -c 'cat & kill $$'
cria um processo em segundo plano e seu pai morre, você fica órfão e acaba sendo colhido eventualmente. esse é o trabalho do init - é por isso que todos caem nisso.
systemd--bash--chromium
. Todos os métodos que eu tento acabarão levando a uma árvore de processos da seguinte forma systemd--chromium
quando eu gerar o Firefox do shell. Como a concha é demonizada aqui? Não está associado a nenhum terminal.