我想以某种方式控制子脚本。我正在创建一个主脚本,它会生成许多子脚本,并且需要RESUME
和PAUSE
。
儿童
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
答案 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。