シェルスクリプトプロセスフォーク

シェルスクリプトプロセスフォーク

私はシェルスクリプトを実行して環境変数が親プロセスから子プロセスに継承され、継承ツリーを表示するために使用される方法を理解するためにいくつかの実験を行っていますzshpstree <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です。

  1. なぜ私たちは別の方法で行動するのですか?
  2. pstreeはどのようにプロセス名を決定し、ツリーを描画しますか?
  3. 実行時にプロセス名が変更されましたか?

ベストアンサー1

プログラムは独自のコマンドラインを変更できます(psCMD列またはに示すように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では、実際の実行可能ファイルを取得できます。

おすすめ記事