我有一个bash脚本,在循环中进行一些并行处理。我不希望并行处理使CPU负载过高,因此我使用了sleep命令。以下是简化版本。
(while true;do sleep 99999;done)&
因此,我在bash提示符下执行上面的命令,会得到类似以下内容:
[1] 12345
其中[1]是作业编号,12345是while循环的进程ID(pid)。我执行kill 12345,然后得到以下结果:
[1]+ Terminated ( while true; do sleep 99999; done )
看起来整个脚本都被终止了。但是,我执行ps aux|grep sleep,发现sleep命令仍在继续运行,但具有自己的pid!我可以杀死sleep,一切似乎都很好。但是,如果我首先杀死sleep,则while循环将启动新的sleep pid。这让我感到惊讶,因为sleep与while循环不是并行的。循环本身是单个执行路径。
因此,我有两个问题:
1.为什么sleep命令会获得自己的进程ID?
2.如何轻松地杀死while循环和sleep?
(while true;do sleep 99999;done)&
因此,我在bash提示符下执行上面的命令,会得到类似以下内容:
[1] 12345
其中[1]是作业编号,12345是while循环的进程ID(pid)。我执行kill 12345,然后得到以下结果:
[1]+ Terminated ( while true; do sleep 99999; done )
看起来整个脚本都被终止了。但是,我执行ps aux|grep sleep,发现sleep命令仍在继续运行,但具有自己的pid!我可以杀死sleep,一切似乎都很好。但是,如果我首先杀死sleep,则while循环将启动新的sleep pid。这让我感到惊讶,因为sleep与while循环不是并行的。循环本身是单个执行路径。
因此,我有两个问题:
1.为什么sleep命令会获得自己的进程ID?
2.如何轻松地杀死while循环和sleep?
sleep
是bash的内置命令,而不是一个进程。现在更有意义了。 - User1type sleep
或type -a sleep
比which
更好。which
是一个外部命令;它无法检测别名、函数或内置命令。比较一下which echo
和type echo
的输出。 - Keith Thompsonecho
这样的东西是内置命令,因为这使它们更有效率(在某些情况下,例如cd
,因为它们具有无法通过运行外部命令实现的语义)。sleep
的效率并不重要,所以将其作为内置命令没有太多意义。 - Keith Thompson