我开发了一个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,因此它将分叉,您将在进程列表中看到其中两个。 (如果您想了解有关具体情况的更多详细信息,请在问题中发布脚本的完整内容。)