Shell-Script

shell 腳本程序分叉

  • May 5, 2017

我正在做一些實驗,以了解環境變數如何通過執行 shell 腳本從父程序繼承到子程序,zsh然後用於pstree <username>查看繼承樹。

我想 zsh 做一個 fork 來執行一個腳本。但是pstree中的程序名不是腳本文件名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. 某些東西在執行時更改了程序名稱?

程序可以更改它自己的命令行(如ps的 CMD 列中所示,或pstree)。這就是 zsh 正在做的事情——它將它的命令名稱更改為 shell 腳本,大概是為了更容易知道每個 zsh 在查看ps.

例如(雖然我使用的是 bash,而不是 zsh,但在 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 上,您可以通過 獲得實際的執行檔。

引用自:https://unix.stackexchange.com/questions/363264