You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两进程信号乒乓交互脚本报错: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

运行步骤

  1. 先给两个脚本添加执行权限:
chmod +x player1pp.sh player2pp.sh
  1. 运行第一个脚本:
./player1pp.sh

此时你会看到终端里不断打印双方互传信号的日志,完美实现乒乓式交互~

内容的提问来源于stack exchange,提问作者Alex_DeLarge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:15:59