私はシェルスクリプトを実行して環境変数が親プロセスから子プロセスに継承され、継承ツリーを表示するために使用される方法を理解するためにいくつかの実験を行っていますzsh
。pstree <username>
私はzshがスクリプトを実行するためにフォークを行うと思います。ただし、pstreeのプロセス名は.dllではなくスクリプトファイル名ですzsh
。
#parent.sh
#! /bin/zsh
export AMA=1
./childEcho.sh #call child
#childEcho.sh
#! /bin/zsh
echo ${AMA}
./subchild.sh #call sub_child
#subchild.sh
#! /bin/zsh
echo ${AMA}
sleep 5d #sleep so that pstree can see the process tree
それからpstree
見せてください
sshd───zsh───parent.sh───childEcho.sh───subchild.sh───sleep
その後、スクリプトからhashbangヘッダーを削除して再実行して渡すと、次のような結果がpstree
得られます。
sshd───zsh───sh───sh───sh───sleep
プロセスはスクリプトファイル名の代わりにshです。
- なぜ私たちは別の方法で行動するのですか?
- pstreeはどのようにプロセス名を決定し、ツリーを描画しますか?
- 実行時にプロセス名が変更されましたか?
ベストアンサー1
プログラムは独自のコマンドラインを変更できます(ps
CMD列またはに示すようにpstree
)。これがzshが行うことです。おそらく、コマンド名をシェルスクリプトに変更してくださいps
。
たとえば、(zshではなくbashを使用していますが、zshでもうまく動作します。テストしました):
$ perl -E '$0 = "I AM PERL"; sleep(60);' &
[1] 504
$ ps 504
PID TTY STAT TIME COMMAND
504 pts/22 S 0:00 I AM PERL
readlink /proc/PID/exe
少なくともLinuxでは、実際の実行可能ファイルを取得できます。