2016-11-24 97 views
0

我写了一个shell脚本来恢复所有挂起的进程。 对命令的研究,这是我现在:恢复停止shell脚本处理

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

但似乎没有任何happend ...我创建了一个循环永远虚拟shell脚本,拼命地跑,并停止它。运行我的shell脚本后,它不会恢复。这是为什么发生?

+0

他们是否在等待标准输入?他们为什么被暂停?运行'jobs -l'。 – Jdamian

+0

这个虚拟程序被暂停,因为我称为kill -STOP。编辑我的问题包括这一点。 –

回答

0

您需要使用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) 

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

+0

那么在脚本中没有办法做到这一点?因为我在脚本上试过你的解决方案,但它不起作用。 –

+0

您是否在脚本中设置了'set -m'? – cdarke

+0

是的,我的确和你建议的一样.. –

0

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

试着把你的代码放入一个函数中,然后在你要继续这些工作的shell中运行它。

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

(注意为$(...)将优先于`...` - 它没有很大的差异在这里,但是你应该学会喜欢的时候的确很重要的现代语法)。

代码虽然很简单,但将它放入函数中可能没有意义。您可以进一步简化:xargs

jobs -sp | xargs kill -CONT