Php

$$和$有什麼區別!使用 /bin/bash -c 時

  • February 6, 2018

我試圖理解@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 人閒逛。

引用自:https://serverfault.com/questions/895962