1
11
因为他们不是
因为将来有人可能会等待这些进程,所以内核无法完全摆脱它们,或者它将无法执行
当您从shell启动一个时,shell会捕获sigchld并无论如何执行各种等待操作,因此没有什么东西会长期失效。 但是克罗恩并没有处于等待状态,他正在睡觉,所以这个死去的孩子可能会在一旁呆一段时间,直到克罗恩醒来。 更新: 正在答复评论… 嗯,我确实设法复制了这个问题:
所以,我想发生的是:
|
2
4
我怀疑cron正在等待会话中的所有子进程终止。关于负PID参数,请参见等待(2)。您可以通过以下方式看到SESS:
以下是我看到的(编辑的):
请注意,sh和sleep在同一个sess中。 使用命令setsid(1)。这是tester.sh:
注意你不需要
|
3
4
在我看来,这是由于进程crond(由crond为每个任务生成)等待stdin上的输入导致的,stdin通过管道连接到crontab中命令的stdout/stderr。这是因为cron能够通过邮件将结果输出发送给用户。 所以crond正在等待eof,直到用户命令和它生成的所有子进程关闭管道。如果这样做了,crond将继续使用wait语句,然后失效的用户命令将消失。 因此,我认为您必须从管道中显式地断开脚本中生成的每个子进程(例如,通过将其重定向到一个文件或/dev/null)。 所以下面的行应该在crontab中工作:
|
4
3
i_d建议您通过不使用两个单独的过程来解决问题:have
这将消除多余的过程。 |
5
1
我在寻找类似问题的解决方案时发现了这个问题。不幸的是,这个问题的答案没有解决我的问题。 杀死失效的进程不是一个选项,因为您需要找到并杀死它的父进程。我以以下方式结束了这些已失效的进程:
在“grep”中,您可以将搜索范围缩小到您所追求的特定失效流程。 |
6
-2
我对同一个问题做了很多次测试。 最后我找到了解决办法。 只需在bash脚本之前指定“/bin/bash”,如下所示。 * * * * * /bin/bash /tmp/launcher.sh /tmp/tester.sh |
Batavia · Bash-删除大目录中的文件 1 年前 |
stackbiz · 如何在bash中将所有换行符替换为“\n” 1 年前 |
Paul · Bash wait命令忽略指定的进程ID 2 年前 |