【问题标题】:shell script to resume stopped processes用于恢复已停止进程的 shell 脚本
【发布时间】:2016-11-24 15:52:22
【问题描述】:

我编写了一个 shell 脚本来恢复所有挂起的进程。 经过对命令的研究,这就是我现在所拥有的:

#!/bin/bash
for i in `jobs -sp`; do
  kill -CONT $i
done

但似乎什么也没发生...我创建了一个永远循环、运行并停止它的虚拟 shell 脚本。运行我的 shell 脚本后,它不会恢复。为什么会这样?

【问题讨论】:

  • 他们在等待标准输入吗?他们为什么被停职?运行jobs -l
  • 这个虚拟程序被暂停,因为我调用了 kill -STOP。编辑了我的问题以包含此内容。

标签: bash unix process resume


【解决方案1】:

您需要使用set -m 在shell 脚本中使用作业控制,请参阅Why can't I use job control in a bash script?

这是我的解决方案:

set -m

while read i
do
  kill -CONT $i
done < <(jobs -sp)

我正在使用进程替换而不是反引号。

【讨论】:

  • 那么有没有办法在脚本中做到这一点?因为我在脚本上尝试了您的解决方案,但没有成功。
  • 你在脚本中做了set -m吗?
  • 好的。使用 xttrace 运行脚本 (bash -x script-name)。
【解决方案2】:

运行脚本会启动一个子shell,它显然没有任何停止的作业,因为您刚刚启动它。

尝试将您的代码放在一个函数中,然后在您希望继续这些工作的 shell 中运行它。

cont () {
    local i
    for i in $(jobs -sp); do
      kill -CONT $i
    done
}

(请注意$(...) 优于`...` ——这并没有太大区别,但你应该学会在重要的时候更喜欢现代语法。)

代码非常简单,但将它放在函数中可能没有意义。您可以使用xargs 进一步简化:

jobs -sp | xargs kill -CONT

【讨论】: