在 Linux 中杀死一个进程并强制它返回 0?

seg*_*a01 22 linux kill process

在 Linux 环境中,如何向进程发送终止信号,同时确保从该进程返回的退出代码为 0?我是否必须为此做一些花哨的 GDB 魔术,或者是否有我不知道的花哨的终止信号?

测试用例:

cat; echo $?

killall cat
Run Code Online (Sandbox Code Playgroud)

尝试各种终止信号只会提供不同的返回信号,例如 129、137 和 143。我的目标是终止脚本运行的进程,但让脚本认为它成功了。

小智 25

您可以使用 GDB 和进程 ID 附加到进程,然后将call命令exit(0)作为参数发出。

call允许您在正在运行的程序中调用函数。调用exit(0)退出,返回码为 0。

gdb -p <process name>
....
.... Gdb output clipped
(gdb) call exit(0)

Program exited normally.
Run Code Online (Sandbox Code Playgroud)

作为单行工具:

gdb --batch --eval-command 'call exit(0)' --pid <process id>
Run Code Online (Sandbox Code Playgroud)

  • @CristianCiupitu 有办法解决这个问题。在进入下一个系统调用时,只需修改相关寄存器即可使目标程序以“0”作为参数调用“_exit”系统调用。这将适用于任何不只是循环和燃烧 CPU 周期的进程。如果进程碰巧没有陷入无限循环,如果您可以在其可执行文件的某处找到必要的指令并将指令指针指向那里,您仍然可以使用相同的方法。 (2认同)

Ign*_*ams 8

不。当shell 捕获SIGCHLD它时,它无条件地将返回值适当地设置为非零值,因此这将需要修改脚本或shell。