【发布时间】:2014-09-05 10:58:10
【问题描述】:
我有一个小问题,可能这是一个愚蠢的问题,但我大约一周前开始学习 bash ...... 我有 2 个脚本,a.sh 和 b.sh。我需要让两者不断运行。 b.sh 应该等待来自 a.sh 的信号
(我试图解释: a.sh 和 b.sh 运行 --> a.sh 向 b.sh 发送信号 -> b.sh 捕获信号,执行某些操作 --> a.sh 执行其他操作,然后发送另一个信号 --> b. sh 捕获信号,执行某些操作 --> 等等)
这是我尝试过的:
a.sh:
#!/bin/bash
./b.sh &;
bpid=$!;
# do something.....
while true
do
#do something....
if [ condition ]
then
kill -SIGUSR1 $bpid;
fi
done
b.sh:
#!/bin/bash
while true
do
trap "echo I'm here;" SIGUSR1;
done
当我运行 a.sh 时,我没有从 b.sh 得到任何输出,即使我将标准输出重定向到一个文件... 但是,当我从我的 bash shell 在后台运行 b.sh 时,它似乎回答了我的 SIGUSR1(使用相同的命令直接从 shell 发送)(我得到了正确的输出) 我错过了什么?
编辑: 这是我正在尝试运行的一个简单示例:
a.sh:
#!/bin/bash
./b.sh &
lastpid=$!;
if [ "$1" == "something" ]
then
kill -SIGUSR1 $lastpid;
fi
b.sh:
#!/bin/bash
trap "echo testlog 1>temp" SIGUSR1;
while true
do
wait
done
运行 a.sh 时无法获取文件“temp”。
但是,如果我手动执行./b.sh & 然后kill -SIGUSR1 PIDOFB,一切正常...
【问题讨论】:
-
另外你不需要重复安装陷阱。一次就够了。像这样的while循环绝对会烧通过cpu。你绝对应该在里面加一个短暂的睡眠。
-
我假设的另一个错字是
./b.sh &;无效。你不能同时拥有&和;作为这样的终结者。在构建最小测试用例时,您需要小心正确地复制实际用例。您是否测试过这个最小案例,看看它是否与您的实际案例有相同的问题? -
我没说不要循环。我说不要在循环中设置陷阱。捕获时陷阱不会消失(据我所知),因此您只需设置一次陷阱处理程序。
-
循环只需要阻止你的脚本退出。陷阱处理程序完成这项工作。
trap "handler" SIGUSR1命令添加一个陷阱处理程序,它不会暂停脚本等待该信号进入。获取一个最小的工作脚本对失败并更新你的和他们一起发帖。在那之前,这是无法解决的。 -
那些文字脚本在这里工作。虽然
a.sh显然只向b.sh发送一次信号,然后退出并让b.sh运行。此外,wait并没有为你做任何事情,因为b.sh对wait没有任何作用,所以b.sh仍然忙于循环并耗尽你所有的 CPU。