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

标签 bash shell unix signals

我有一个小问题,可能这是一个愚蠢的问题,但我大约一周前开始学习 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/

相关文章:

bash - 在提交后颠覆 Hook 中获取项目名称

bash - 如何在 foreach 语句中使用管道

c - 破折号和 C : eval "$(<cmdfile)" and system ("eval\"\$(<cmdfile)\"") giving different results

linux - lseek() on/dev/watchdog 导致系统崩溃

unix - El-cheapo如何监视群集中的任务并在它们崩溃时重新启动( self 修复)?

JavaScript:从网络复制时, trim 所有前导空格以及所有 CR

Bash 解析 docker status 检查本地镜像是否是最新的

bash - 比较两个未排序的文件

linux - Bash 脚本 : parsing string with a command without executing it

file - 如何在文件的每一行的开头添加字符串