【发布时间】:2014-04-04 21:48:27
【问题描述】:
我发出命令task1 & task2 dir/ && task3 &
- Task1 永远不会结束,所以我们将它发送到后台。
- Task2 更改目录
- Task3 依赖于 task2 的完成。
发布:jobs -l 将显示:
[1]- 39281 Running task1 &
[2]+ 39282 Running task2 && task3 &
发布:ps 将显示:
39281 ttys002 0:04.17 task1
39282 ttys002 0:00.00 task2
39283 ttys002 0:03.66 task3
问题:
- 有没有办法在作业命令输出中显示 task3?
- 为什么 task3 不显示为自己的工作?
- 有没有办法同时杀死所有三个任务?
- 如果我杀死 task2,为什么 task3 不会死?
- 有没有更好的方法来做到这一点?
目标: 发出一行命令来启动工作流程并将其发送到后台。准备就绪后,一次性杀死所有启动的进程。
对于上下文,就我而言,task1 是一个带有 livereload 的 grunt 任务,因此它应该被发送到后台。 Task2 更改目录,以便 task3 可以查看该目录中更改的文件。
【问题讨论】:
-
使用pstree -ap 看看tasks之间的关系,可能task3不是你的儿子。
-
我手头没有电脑,但是如果你把括号括起来让它在一个子shell中运行会发生什么?杀死子shell是否允许您杀死孩子?
-
task2 是一项长期运行的任务吗?我试图重现这一点,但不能。 $ ./task1 & ./task2 && ./task3 & 如果您可以提供重现不良行为的简短脚本示例,这可能会很有用。
-
@michael - 我在 OS X 上,所以 pstree 不可用。
-
cd是一个内置的 shell,不会出现在ps的输出中。此外,如果task2是一个单独的进程,它对其自己的 工作目录所做的任何更改都不会影响task3。