我发出命令task1 & task2 dir/ && task3 &
发布: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
问题:
目标: 发出一行命令来初始化工作流并将其发送到后台。准备好后,一次性杀死所有已启动的进程。
对于上下文,在我的情况下,task1是一个带有livereload的grunt任务,所以应该将它发送到后台。 Task2更改目录,以便task3可以监视该目录中更改的文件。
答案 0 :(得分:2)
将bash与job control一起使用,可以与
同时或多或少地杀死最近的两个后台任务kill %% %-
如果您希望作业不显示cd
部分,您需要更改当前shell中的目录,这意味着隔离cd
表达式:
sleep 10000 & cd .. && { sleep 20000 & }
答案 1 :(得分:2)
这会终止从该shell启动的所有子进程,包括后台进程:
pkill -P $(echo $$)
答案 2 :(得分:0)
问题:
有没有办法在jobs命令输出中显示task3?
不是这种情况。
为什么task3不作为自己的工作出现?
因为task3不是一个独立的进程,所以与其他进程分开启动,比如task1,但它取决于task2的返回值(请记住,task2理想情况下可以在进程结束前将值返回给shell)。只有当task3将一个值返回给shell时,整个" flow"将为shell完成。这就是task2 AND task3必须都有一个作业ID的原因。
有没有办法同时杀死所有三个任务?
我想我不明白这个问题,对不起。您可以使用pid,因此可以通过pid终止进程。
因为task2不是task3的父级,而只是一个将在 task2之后执行的任务将向shell返回一个非错误代码。
这意味着在这种情况下,task2和task3是两个独立的进程,它们将在同一个调用上下文中运行。您示例中的task2 dir/ && task3 &
类似于以下内容:
(task2 dir/
if [ $? -eq 0 ]; then
task3
fi
)&
正如您所看到的,task2和task3没有以任何方式链接,只是task2的错误代码。
有更好的方法吗?
我认为你做得很好。
换句话说:
" job"是一个完整的进程流,它将从第一个进程开始,并在最后一个进程将错误代码返回给shell时结束。在这种情况下,task2和task3必须具有单个作业ID。这就是我们使用'工作的原因。如果'处理'
来自"进程层次结构"透视,task2和task3完全独立,因此它们将有两个不同的pid,PPID将始终是bash shell。
关于你的目标:我仍然认为我不明白。你有task1和task3 pids,你可以用一个kill命令杀死它们,如:kill pid-for-task1 pid-for-task2
。