在脚本之间发送信号(bash)

时间:2014-09-04 15:02:12

标签: bash shell unix signals

我有点问题,可能这是一个愚蠢的问题,但我在一周前开始学习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,那么一切正常......

1 个答案:

答案 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 (主)脚本中读取它。