首页 > 解决方案 > 在 bash 中捕获 process.kill?

问题描述

我正在尝试通过进程类运行 bash 脚本并在使用 process.kil() 时执行某些操作但似乎没有触发退出信号,所以:

A. 有可能吗?

B. 如果不可能,有没有办法向进程发送信号?

脚本.sh

#!/bin/bash
Exit(){
echo "terminated">>log.txt
kill $child}
trap Exit EXIT
 daemon &
child=$!
echo $child > log.txt
wait $child

C#代码:

Process script = new Process()
script.StartInfo.Filename = "Script.sh"
script.Start()
//Other stuff
script.Kill()

C# script.Kill 似乎不会触发 Script.sh 中的 Exit()

通过 ubuntu 的系统监视器退出确实会触发它。

编辑:

将信号更改为 SIGTERM 并没有改变结果。

标签: linuxubuntu.net-core

解决方案


EXIT在 UNIX/Linux中没有这样的信号。SIGTERM 最接近你想要的,也是 kill 使用的默认信号。

但是,bash 有一个名为EXIT. 它在Bash 手册 - Bourne Shell Builtins - 陷阱中进行了描述,您可能会对此感到困惑。

如果 sigspec 为 0 或 EXIT,则在 shell 退出时执行 arg。如果 sigspec 是 DEBUG,则命令 arg 在每个简单命令、for 命令、case 命令、select 命令、每个算术 for 命令之前执行,并且在第一个命令在 shell 函数中执行之前执行。有关它对 DEBUG 陷阱的影响的详细信息,请参阅 shopt 内置函数的 extdebug 选项的描述(请参阅 The Shopt Builtin)。如果 sigspec 为 RETURN,则每次使用 . 或源内置完成执行

如果您打算使用它,那么您应该使用以下行开始您的脚本:

#!/bin/bash

以确保它在 bash shell 下运行。

有关 Linux 中所有信号的列表,请参见http://man7.org/linux/man-pages/man7/signal.7.html


推荐阅读