Chr*_*ski 2 shell bash process signals
bash -c "sleep 5; echo 'test'"
Run Code Online (Sandbox Code Playgroud)
如果我运行上面的命令,并CTRL-C
在 中按下sleep 5
,它将终止整个过程并且echo 'test'
不会显示。
我怎样才能运行上面的命令并允许sleep
命令处理SIGINT
( CTRL-C
)?
我猜是SIGINT
bash 进程而不是内部命令?
小智 6
bash
(和其他 shell)在没有作业控制的情况下运行脚本,因此 ^C 将杀死整个脚本,而不仅仅是sleep
(因为它们都是同一前台进程组的一部分)。
您应该在该脚本中使用以下命令打开作业控制set -m
:
$ bash -c 'set -m; sleep 5; echo test'
^Ctest
$
Run Code Online (Sandbox Code Playgroud)
或者捕获SIGINT
脚本中的信号:
$ bash -c 'trap : SIGINT; sleep 5; echo test'
^Ctest
$
Run Code Online (Sandbox Code Playgroud)
注意:
代替''
; 如果您忽略,SIGINT
它的子进程将继承该配置并且也会忽略它。
我猜 SIGINT 将进入 bash 进程而不是内部命令?
它会发送给他们两个——一个VINTR
字符(^C
默认情况下)将从SIGINT
前台作业(进程组)向所有进程发送信号。
归档时间: |
|
查看次数: |
2893 次 |
最近记录: |