Bash 脚本和创建的进程

Bash 脚本和创建的进程

我有一个 bash 脚本,每 10 分钟作为 su cron 运行一次。在脚本顶部,我声明:

#!/bin/bash

在 crontab 中,我使用 /bin/bash 运行它。我对从主脚本调用的所有脚本执行相同的操作。

我注意到创建了两个线程:

/bin/bash /main/script
/bin/sh -c /main/script

并且,所有其他被调用的脚本都有自己的单线程(仅 bash)。

你能向我解释一下这种行为吗?

答案1

Cron 使用 shell 来运行命令。对于该用户来说,shell 是/bin/sh,因此对于如下行:

* * * * * /bin/bash /some/script

Cron 运行:

/bin/sh -c '/bin/bash /some/script'

如果 shell 设置为/bin/bash,它将运行:

/bin/bash -c '/bin/bash /some/script

现在你为什么看不到bash -cbash 的进程?当给出一个简单的命令时,Bash 会直接execs 命令,而不是forking 和execing:

$ strace -fe clone,execve bash -c 'bash foo.sh'
execve("/bin/bash", ["bash", "-c", "bash foo.sh"], [/* 15 vars */]) = 0
execve("/bin/bash", ["bash", "foo.sh"], [/* 15 vars */]) = 0
clone(Process 466 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f93bda10a10) = 466
[pid   466] execve("/bin/true", ["/bin/true"], [/* 15 vars */]) = 0
[pid   466] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=466, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

其中dash,即/bin/sh

$ strace -fe clone,execve dash -c 'bash foo.sh'
execve("/bin/dash", ["dash", "-c", "bash foo.sh"], [/* 15 vars */]) = 0
clone(Process 473 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f7f31650a10) = 473
[pid   473] execve("/bin/bash", ["bash", "foo.sh"], [/* 15 vars */]) = 0
[pid   473] clone(Process 474 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f408d740a10) = 474
[pid   474] execve("/bin/true", ["/bin/true"], [/* 15 vars */]) = 0
[pid   474] +++ exited with 0 +++
[pid   473] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=474, si_status=0, si_utime=0, si_stime=0} ---
[pid   473] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=473, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

您可以在此处看到额外的克隆。

相关内容