两进程信号乒乓交互脚本报错:kill无对应进程,求排查
问题排查与修正方案
我来帮你梳理下导致报错的核心原因,你的两个脚本主要有三个关键问题,咱们一步步解决:
1. 未捕获后台进程的PID
第一个脚本里启动player2pp.sh后,没有把后台进程的PID存到pidp2变量里,导致trap指令里的$pidp2是空值——虽然当前报错不是来自这里,但这个问题会直接让后续的乒乓交互中断,因为第一个脚本收到信号后根本不知道要发给谁。
2. 第一个脚本过早退出
第一个脚本执行完sleep 2后就直接结束进程了!而player2pp.sh里的$1是第一个脚本的初始PID,等player2pp.sh睡2秒再去kill这个PID时,第一个脚本已经不存在了,这就是你看到kill: no corresponding process报错的直接原因。
3. Player2脚本执行完即退出
player2pp.sh发完第一个信号、睡2秒后就直接退出了,根本没法接收第一个脚本发回来的信号,乒乓交互自然没法持续下去。
修正后的完整脚本
第一个脚本(命名为player1pp.sh)
#!/bin/bash PATH=${PATH}:"/home/cosimo/Università/Sistemi Operativi/scripts" # 启动Player2并把它的PID存到pidp2变量中 exec player2pp.sh $$ & pidp2=$! # 收到SIGUSR1时,给Player2回发信号,同时打印日志方便观察交互过程 trap 'echo "[Player1] 收到信号,回传给Player2 (PID: $pidp2)"; kill -SIGUSR1 $pidp2' SIGUSR1 # 保持进程运行,避免过早退出 echo "[Player1] 启动完成,我的PID: $$,Player2 PID: $pidp2" sleep infinity
第二个脚本(player2pp.sh)
#!/bin/bash player1_pid=$1 # 收到SIGUSR1时,给Player1回发信号 trap 'echo "[Player2] 收到信号,回传给Player1 (PID: $player1_pid)"; kill -SIGUSR1 $player1_pid' SIGUSR1 # 主动发送第一个信号,启动乒乓交互 echo "[Player2] 启动完成,Player1 PID: $player1_pid" sleep 2 kill -SIGUSR1 $player1_pid # 保持进程运行,等待接收信号 sleep infinity
运行步骤
- 先给两个脚本添加执行权限:
chmod +x player1pp.sh player2pp.sh
- 运行第一个脚本:
./player1pp.sh
此时你会看到终端里不断打印双方互传信号的日志,完美实现乒乓式交互~
内容的提问来源于stack exchange,提问作者Alex_DeLarge
相关产品推荐
相关产品推荐

