質問を正確に表現するのは難しいと思いますが、最善を尽くします。dwm
デフォルトのウィンドウマネージャーとして使用し、dmenu
私のアプリケーションランチャーとして。ブラウザ以外のGUIアプリケーションはほとんど使用しません。私の作業のほとんどは、コマンドラインから直接行われます。さらに、私はオペレーティングシステム、アプリケーションなどに関するミニマリズムの大ファンです。私が取り除けなかったツールの1つは、アプリケーションランチャーでした。主に、アプリケーションランチャーの動作/動作について正確に理解していないためです。大規模なインターネット検索でも、あいまいな説明しか表示されません。私がやりたいのは、アプリケーションを実際に生成すること以外はまったく使用できないため、アプリケーションランチャーを削除することです。これを行うには、シェルからアプリケーションを「正しく」起動する方法を知りたいと思います。これにより、「正しく」の意味は「アプリケーションランチャーが行うように」に近似できます。
シェルからプロセスを生成する次の方法について知っています。
exec /path/to/Program
新しいプロセスを作成せずに、指定されたコマンドでシェルを置き換えますsh -c /path/to/Program
シェル依存プロセスを起動する/path/to/Program
シェル依存プロセスを起動する/path/to/Program 2>&1 &
シェルに依存しないプロセスを起動するnohup /path/to/Program &
シェルに依存しないプロセスを起動し、出力をnohup.out
更新1:さまざまな条件下でのdmenu
繰り返し呼び出しからの再構築などを説明できps -efl
ます。新しいシェル/bin/bash
と、このシェルの子としてアプリケーションが生成されます/path/to/Program
。子供が周りにいる限り、シェルは周りにあります。(これを管理する方法は私を超えています...)対照的にnohup /path/to/Program &
、シェルから発行する場合/bin/bash
、プログラムはこのシェルの子になりますが、このシェルを終了すると、プログラムの親が最上位のプロセスになります。したがって、最初のプロセスがたとえば/sbin/init verbose
、それがあった場合、それはPPID 1
プログラムの親になります。ここで私は、グラフを使って説明しようとしたものです:chromium
経て発足したdmenu
、firefox
使用して開始されました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
更新2:質問は次のように要約することもできると思います:プロセスの親はどうあるべきですか?たとえば、シェルであるか、init
プロセス、つまりプロセスである必要がありますPID 1
か?
init
-答えは...多分ですか?どのように/どのように話したいか、何init
を使用するか、データチャネルがどこにあるかによって異なります。一般に、そのようなものはうまくいく傾向があります-それinit
が目的です。いずれにせよ、通常はプロセスをデーモン化するときにinit
。または、ジョブ制御が必要な場合は、現在のシェル。
dmenu
、学んだこととどうやって調和するかを見ていきます。私は見つけるexec /path/to/Program & exit
か/bin/bash -c /path/to/Program & exit
、非常に使いやすいです。しかし、それらはすべて、1
つまりinit
、その親になりProgram
、これが理にかなっていて、基本*nix
原則に違反しない限り、私にとっては問題ありません。
exec &
だからだと思う。私は通常、端末から自分のことをします...多分あなたはここでベン・クロウェルの質問からいくつかの使用を得るでしょう。答えはありますが、どれも非常に優れています。とにかく、プロセスをバックグラウンドにすると、その親が次のように死んだsh -c 'cat & kill $$'
とき、あなたはそれを孤児にし、最終的に刈り取られます。それがinitの仕事です-だからこそ、彼らはそれに陥ります。
systemd--bash--chromium
。私が試みるすべてのメソッドsystemd--chromium
は、シェルからfirefoxをスポーンすると、最終的に次の形式のプロセスツリーにつながります。ここでシェルはどのように悪魔化されますか?どの端末にも関連付けられていません。