我開發了一個bash腳本接受參數:
$ head -n 3 MyScript.sh
#!/usr/bin/env bash
# This is my script
#... do something
我透過調用它克朗在不同的調度和不同的參數:
$ crontab -l
* * * * * MyScript.sh 1 -t 600
*/2 * * * * MyScript.sh 40
*/3 * * * * MyScript.sh 41,42
*/5 * * * * MyScript.sh 61
* * * * * MyScript.sh 21
當想知道什麼的時候實例正在運行(腳本不是很長,只是執行了幾秒鐘):
$ pgrep -f -a -l "MyScript.sh"
25003 /bin/sh -c MyScript.sh 21
25005 /bin/sh -c MyScript.sh 41,42
25006 bash /bin/MyScript.sh 21
25007 bash /bin/MyScript.sh 41,42
25008 /bin/sh -c MyScript.sh 40
25009 bash /bin/MyScript.sh 40
25010 /bin/sh -c MyScript.sh 1 -t 600
25012 bash /bin/MyScript.sh 1 -t 600
我們可以在上面的範例中看到MyScript.sh 21
(和任何其他)實例顯然運行了兩次,其中一個從 via 開始bash
,另一個從 via 開始/bin/sh -c
。正如我已通過 確認的那樣,兩者確實同時開始和結束htop
。
我正在 RaspBian 中執行這些測試(德班基於)。
下面是執行相同腳本時發生的情況的範例自由BSD:
$ pgrep -f -a -l "MyScript.sh"
78230 bash /bin/MyScript.sh 103
78106 bash /bin/MyScript.sh 470
77484 bash /bin/MyScript.sh 2
77430 bash /bin/MyScript.sh 451
77019 bash /bin/MyScript.sh 52
76922 bash /bin/MyScript.sh 101 -v -d
76642 bash /bin/MyScript.sh 1 -t 600
76174 bash /bin/MyScript.sh 102 -v -d
可以看出,BSD 沒有這些重複的實例。
為什麼會發生這種情況在 RaspBian 上,我怎麼才能解決它?實際上,我是否需要“解決”它?
答案1
您的腳本正在子 shell 內執行某些操作。例子:
#!/usr/bin/env bash
sleep 10
echo outer done
#!/usr/bin/env bash
(sleep 10; echo inner done)
echo outer done
如果您執行其中第一個,則沒有子 shell,因此您只能在進程清單中看到其中一個。如果您運行其中第二個,則會有一個子 shell,因此它將分叉,您將在進程列表中看到其中兩個。 (如果您想了解有關具體情況的更多詳細信息,請在問題中發布腳本的完整內容。)