pstreeがスクリプトを解釈したシェル名の代わりにスクリプト名を表示するのはなぜですか?

pstreeがスクリプトを解釈したシェル名の代わりにスクリプト名を表示するのはなぜですか?

次のように単純なシェルスクリプトを作成しました。

#!/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.shshebang行があります。pstree実行している場合

sh ./sleepy.sh

sh出力でこれを確認できます。pstree

ps -fまたはps u(およびpstree -a)読んで/proc/<pid>/cmdline検索コマンドライン、これは異なります。これはargvシステムコールに渡されるパラメータですexecve。 shebangを使用してシェルスクリプトを実行すると、shebangを含めるように変更されます。これは間違いなくあなたのケースがps表示される理由です。

/bin/bash ./sleepy.sh

(望むよりプログラムの仕組みこれに関する追加情報)。

おすすめ記事