次のように単純なシェルスクリプトを作成しました。
#!/bin/bash
sleep 90
このシェルを実行した後、pstree
プロセスツリー構造を確認するために別のシェルで実行しました。
これが私が見るものです
-gnome-terminal-+-bash---sleepy.sh---sleep
これくらいだろうと予想しました。
-gnome-terminal-+-bash---bash---sleep
シェルスクリプトがpstreeによってプロセスとして表示されるのはなぜですか?このps
コマンドは、実行中のコマンドを次のように正しく表示します。
10150 8771 0 08:13 pts/1 00:00:00 /bin/bash ./sleepy.sh
ここでプロセスはbashで、sleepy.shが対応するパラメータです(私にとっては理解できます)。私のビューでは、プロセスは実行可能リンク可能フォーマットバイナリ(ELF)でなければなりません。 BashはELF実行可能ファイルですが、シェルスクリプトはそうではないので、pstree
そのように表示するべきではないと思いますか?
ベストアンサー1
pstree
次からプロセス名を検索/proc/<pid>/stat
。これはカーネルに与えられたすべてです渡す execve(2)
最初のパラメータを参照してください。proc(5)
そしてシェルからファイルを実行すると、正確に何が起こりますか?もっと学ぶ。後者でカーネルを見ることができますできるシェルスクリプト(および他のいくつかの「バイナリ」)を直接実行してください。モノの驚くべき点は何ですか?)しかし、シェルは特定の状況でも介入します。
だから走るなら
./sleepy.sh
スクリプトの先頭には、シェルがカーネルの実行を要求する出力を見ることができるsleepy.sh
shebang行があります。pstree
実行している場合
sh ./sleepy.sh
sh
出力でこれを確認できます。pstree
ps -f
またはps u
(およびpstree -a
)読んで/proc/<pid>/cmdline
検索コマンドライン、これは異なります。これはargv
システムコールに渡されるパラメータですexecve
。 shebangを使用してシェルスクリプトを実行すると、shebangを含めるように変更されます。これは間違いなくあなたのケースがps
表示される理由です。
/bin/bash ./sleepy.sh
(望むよりプログラムの仕組みこれに関する追加情報)。