Shell-Script
shell 腳本程序分叉
我正在做一些實驗,以了解環境變數如何通過執行 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 而不是腳本文件名。
- 為什麼我們有這種不同的行為?
- pstree如何確定程序名並繪製樹?
- 某些東西在執行時更改了程序名稱?
程序可以更改它自己的命令行(如
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 上,您可以通過 獲得實際的執行檔。