我有一个小问题,可能这是一个愚蠢的问题,但我大约一周前开始学习 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
,一切正常...
最佳答案
可能的解决方案之一是下一个(也许,它是肮脏的,但它有效):
a.sh:
#!/bin/bash
BPIDFILE=b.pid
echo "a.sh: started"
echo "a.sh: starting b.sh.."
./b.sh &
sleep 1
BPID=`cat $BPIDFILE`
echo "a.sh: ok; b.sh pid: $BPID"
if [ "$1" == "something" ]; then
kill -SIGUSR1 $BPID
fi
# cleaning up..
rm $BPIDFILE
echo "a.sh: quitting"
b.sh:
#!/bin/bash
BPIDFILE=b.pid
trap 'echo "got SIGUSR1" > b.log; echo "b.sh: quitting"; exit 0' SIGUSR1
echo "b.sh: started"
echo "b.sh: writing my PID to $BPIDFILE"
echo $$ > $BPIDFILE
while true; do
sleep 3
done
这个想法是简单地从 b(后台)脚本中写下 PID 值,并从 a(主)脚本中读取它。
关于bash - 在脚本之间发送信号(bash),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25668841/