$$和$有什麼區別!使用 /bin/bash -c 時
我試圖理解@sysfault 在此評論中的“oneliner” :
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
我嘗試了以下變體…
內外不同的$$:
/bin/bash -c 'echo $$ && exec sleep 5' ; echo $$ 14408 29700
相同的pid(但在後台):
$ /bin/bash -c 'echo $$ && exec sleep 5' & echo $! [1] 8309 8309 $ 8309 [ 1 ]+ Done /bin/bash -c 'echo $$ && exec sleep 5'
$$ 和 $ 的不同 pid!:
/bin/bash -c 'echo $$ && exec sleep 5 & echo $!' 6504 6503
殺死沒有工作:/bin/bash -c ’echo $$ && (sleep 15 ; echo done)'
19063 Killed $ done (echo 在殺死後出現)
可以訪問前台程序的 pid 的相同 pid:
$ /bin/bash -c 'echo > tmp.pid ; sleep 10 ; echo $$ ; echo done ; echo $$;' 28415 (instantly) 28415 (10 seconds later) done 28415 $ cat tmp.pid 28415
使用此命令,我能夠在睡眠完成之前在另一個視窗中殺死 pid - 防止最後三個迴聲發生:
$ /bin/bash -c 'echo $$ ; sleep 30 ; echo $$ ; echo done ; echo $$;' 23236 Killed
上下文:最終我想通過 php exec() 啟動 bash 程序,並在繼續之前等待結果並保存 pid,以便在按下手動取消按鈕的情況下進行清理。我將處理 2 個昂貴的程序:一個 rsync 和一個 git commit & push。
可靠地獲取包含多個命令(使用 ; > | 或 &&)的前台 bash 腳本的 pid 的最佳方法是什麼?
$$
是目前 shell的 PID 。當您在bash -c
腳本正文中使用 $$ 時,您將獲得生成的 shell的 pid$ echo $$; bash -c 'echo $$'; echo $$ 6872 6987 6872
$!
是最後一個後台程序的 PID$ sleep 5 & echo $!; sleep 5 & echo $!; echo ===; pgrep -l sleep [1] 7118 7118 [2] 7119 7119 === 7118 sleep 7119 sleep
當你這樣做時
bash -c 'echo $$' & echo $!
,你會得到相同的 pid 列印兩次,因為對於你目前的 shell, $ ! is the pid of the backgrounded bash process, and inside the script body, $ $ 是同一個後台 bash 程序的目前 pid。當你這樣做時
/bin/bash -c 'echo $$ && exec sleep 5 & echo $!'
,你會得到兩個不同的 pid:$$ 是 bash 程序的 pid,$! 是睡眠程序的pid。
- 我覺得這很奇怪,因為您正在使用
exec
它,所以它應該是相同的 PID(睡眠程序替換 bash 程序)- 但是,您正在使用
exec ... &
,因此 bash 必須首先派生一個子外殼來執行後台任務,然後 exec用睡眠替換該子外殼。您的實際問題的答案最好由 php 人回答,我不是。您應該將此問題標記給版主,並要求將其移至 Stack Overflow,在那里肯定會有更多的 php 人閒逛。