Bash:如何显示作业流程的完整列表并将其删除

时间:2014-04-04 21:48:28

标签: macos bash kill jobs

我发出命令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

问题:

  1. 有没有办法在jobs命令输出中显示task3?
  2. 为什么task3不显示为自己的工作?
  3. 有没有办法同时杀死所有三个任务?
  4. 如果我杀死task2,为什么没有任务3死?
  5. 有更好的方法吗?
  6. 目标: 发出一行命令来初始化工作流并将其发送到后台。准备好后,一次性杀死所有已启动的进程。

    对于上下文,在我的情况下,task1是一个带有livereload的grunt任务,所以应该将它发送到后台。 Task2更改目录,以便task3可以监视该目录中更改的文件。

3 个答案:

答案 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终止进程。

  1. 如果我杀死task2,为什么task3不会死?
  2. 因为task2不是task3的父级,而只是一个将在 task2之后执行的任务将向shell返回一个非错误代码。 这意味着在这种情况下,task2和task3是两个独立的进程,它们将在同一个调用上下文中运行。您示例中的task2 dir/ && task3 &类似于以下内容:

    (task2 dir/
    if [ $? -eq 0 ]; then
      task3
    fi
    )&
    

    正如您所看到的,task2和task3没有以任何方式链接,只是task2的错误代码。

    有更好的方法吗?

    我认为你做得很好。

    换句话说:

      从bash的角度来看
    • " job"是一个完整的进程流,它将从第一个进程开始,并在最后一个进程将错误代码返回给shell时结束。在这种情况下,task2和task3必须具有单个作业ID。这就是我们使用'工作的原因。如果'处理'

    • ,则代替
    • 来自"进程层次结构"透视,task2和task3完全独立,因此它们将有两个不同的pid,PPID将始终是bash shell。

    关于你的目标:我仍然认为我不明白。你有task1和task3 pids,你可以用一个kill命令杀死它们,如:kill pid-for-task1 pid-for-task2