BASH:暂停并恢复子脚本

时间:2014-08-26 12:16:00

标签: bash signals wait resume pausing-execution

我想以某种方式控制子脚本。我正在创建一个主脚本,它会生成许多子脚本,并且需要RESUMEPAUSE

儿童

Do stuff
PAUSE
Cleanup

sleep 10
RESUME child

这可能吗?

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++

当孩子在后台跑步时,试着用信号做这件事似乎不起作用。

SCRIPT1:

#!/bin/bash

"./script2" &
sleep 1
kill -2 "$!"
sleep 1

SCRIPT2:

#!/bin/bash

echo "~~ENTRY"

trap 'echo you hit ctrl-c, waking up...' SIGINT
trap 'echo you hit ctrl-\, stoppng...; exit' SIGQUIT

while [ 1 ]
do
    echo "Waiting for signal.."
    sleep 60000
    echo "~~EXIT1"
done

echo "~~EXIT2"

运行:

> ./script1

2 个答案:

答案 0 :(得分:2)

控制单个流程脚本的一种方法是使用信号。如果你将SIGINT(ctrl-c)与SIGQUIT(ctrl-)一起恢复为kill,那么子进程看起来像这样:

#!/bin/sh
trap 'echo you hit ctrl-c, waking up...' SIGINT
trap 'echo you hit ctrl-\, stoppng...; exit' SIGQUIT

while (true)
do
    echo "do the work..."
    # pause for a very long time...
    sleep 600000
done

如果您运行此脚本,并点击ctrl-c,则工作继续。如果你点击ctrl- \,脚本就会停止。

你想在后台运行这个然后发送kill -2 $ pid来恢复并杀死-3 $ pid来停止(或杀掉-9会起作用)其中$ pid是子进程的进程id。

这是一个很好的bash信号参考:http://www.ibm.com/developerworks/aix/library/au-usingtraps/

- 这是父脚本......

#!/bin/sh

./child.sh & 

pid=$!

echo "child running at $pid"
sleep 2
echo "interrupt the child at $pid"
kill -INT $pid # you could also use SIGCONT

sleep 2
echo "kill the child at $pid"
kill -QUIT $pid

答案 1 :(得分:1)

一种方法是为每个孩子创建一个命名管道:

mkfifo pipe0

然后重定向孩子的stdin以从管道中读取:

child < pipe0

阻止孩子:

read _

(奇_就是read可以存放它将读取的空行的地方。

恢复孩子:

echo > pipe0

更简单的方法是保存以纯文件描述符形式传递给子节点的stdin,但我不知道确切的语法,并且不能谷歌一个很好的例子ATM。