Linux shell 腳本在進程清單中重複

Linux shell 腳本在進程清單中重複

我開發了一個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,因此它將分叉,您將在進程列表中看到其中兩個。 (如果您想了解有關具體情況的更多詳細信息,請在問題中發布腳本的完整內容。)

相關內容