1

我想以某种方式控制子脚本。我正在制作一个主脚本,它会产生许多子脚本,并且需要RESUME按需PAUSE使用它们。

孩子

Do stuff
PAUSE
Cleanup

家长

sleep 10
RESUME child

这可能吗?

根据建议

在孩子在后台运行时尝试使用信号来执行此操作似乎不起作用。

脚本1:

#!/bin/bash

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

脚本2:

#!/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
4

2 回答 2

2

控制单个进程脚本的一种方法是使用信号。如果将 SIGINT (ctrl-c) 与 SIGQUIT (ctrl-) 结合起来以终止,则子进程如下所示:

#!/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 以恢复并 kill -3 $pid 停止(或 kill -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
于 2014-08-26T13:01:30.903 回答
1

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

mkfifo pipe0

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

child < pipe0

阻止孩子:

read _

(奇怪_的是read有一个地方来存储它将读取的空行)。

恢复孩子:

echo > pipe0

一个更简单的方法是保存以纯文件描述符的形式传递给孩子的标准输入,但我不再知道确切的语法,也无法搜索一个好的示例 ATM。

于 2014-08-26T12:27:51.930 回答