【问题标题】:Cannot send signal SIGINT to a process created inside a script无法将信号 SIGINT 发送到在脚本内创建的进程
【发布时间】:2014-04-05 03:55:17
【问题描述】:

我有两个脚本:

### firstScript.sh ###
trap 'kill $pid;' SIGINT
for ((i=1; i<=10; i++))
do
        echo "$i x $1 = `expr $i \* $1`"
        sleep 10 &
        pid=$!
        wait $!
done

还有:

### secondScript.sh ###
./firstScript.sh 5 &
pid=$!
echo $pid
ps
for (( i=0; i<8; i++))
do
        kill -2 $pid
        sleep 3
done

第二个脚本将在后台模式下调用第一个脚本并每 3 秒向它发送一个 SIGINT 信号。但是,它根本不起作用。

我尝试使用./firstScript.sh 5 &amp; 在后台运行第一个脚本,并使用kill -2 %1kill -2 &lt;pid&gt; 发送信号(在创建第一个脚本后观察到pid),它们都运行良好。

但是,我无法通过脚本做到这一点。

感谢任何帮助。

【问题讨论】:

  • trap 'kill $pid;' SIGINT 在第一个脚本中,但它会杀死哪个 pid
  • $pid 是休眠进程的PID

标签: linux bash signals


【解决方案1】:

如果您希望按照您的预期进行这项工作,请使用不同的信号,例如 SIGUSR1:

### firstScript.sh ###
trap 'kill $pid;' SIGUSR1
for ((i=1; i<=10; i++))
do
        echo "$i x $1 = `expr $i \* $1`"
        sleep 10 &
        pid=$!
        wait $!
done

还有:

### secondScript.sh ###
./firstScript.sh 5 &
pid=$!
echo $pid
ps
for (( i=0; i<8; i++))
do
        kill -USR1 $pid
        sleep 3
done

我花了一些时间试图弄清楚为什么 SIGINT 的行为方式会如此,但还没有。

【讨论】:

  • 太棒了!但是 SIGINT(和 SIGQUIT )不起作用的原因仍然是个谜:)
  • 是的 - 当我有更多时间时,我真的很想回到这个话题。我怀疑使用 INT 信号,当后台作业是在脚本中而不是在交互式会话中创建时,bash 可能会完全忽略它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多