我有点问题,可能这是一个愚蠢的问题,但我在一周前开始学习bash ... 我有2个脚本,a.sh和b.sh.我需要让两者都不断运行。 b.sh应该等待来自a.sh的信号
(我想解释一下: a.sh和b.sh run - > 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
,那么一切正常......
答案 0 :(得分:1)
可能的解决方案之一就是下一个解决方案(也许是它的脏问题,但它有效):
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 (主)脚本中读取它。