如何杀死在终端中运行的脚本,而不关闭终端(Ctrl + C不起作用)?

Modified on: Sat, 09 Jun 2018 22:11:23 +0800

我编写了一个bash脚本,可以调用其他几个程序并执行一堆命令。我从终端运行这个脚本。现在我要杀死剧本。

Ctrl + C有时候不会删除它,我认为因为有时脚本正在执行另一个程序,并且由于某种原因,kill信号不起作用。

但是,如果我关闭终端窗口,它会杀死脚本。

我能做什么(键盘组合),类似于关闭终端窗口,而不是实际关闭终端窗口(我不想丢失命令历史记录,当前目录,输出历史记录等) ?

作者:becko

最佳答案

你几乎没有选择。一种是停止脚本( Ctrl Z ),获取脚本的PID并发送SIGKILL到流程组。

当在shell中执行命令时,它启动的进程及其所有子进程都是同一个进程组(在本例中为前台进程组)。要向该组中的所有进程发送信号,请将其发送给进程负责人。对于kill命令,流程负责人如此表示:

kill -PID

其中PID是脚本的进程ID。

示例:

考虑一个启动某些进程的脚本test.sh。假设您在shell中运行它:

$ ./test.sh

在另一个终端,

$ pgrep test.sh
17802
$ pstree -ps `!!`
pstree -ps `pgrep test.sh`
init(1)───sshd(1211)───sshd(17312)───sshd(17372)───zsh(17788)───test.sh(17802)─┬─dd(17804)
                                                                               ├─sleep(17805)
                                                                               └─yes(17803)

在这种情况下,要向test.sh创建的进程组发送信号,您需要:

kill -INT -17802

-INT用于发送SIGINT,因此该命令相当于按 Ctrl C 在终端上。发送SIGKILL

kill -KILL -17802

如果无法打开其他终端,则只需停止脚本即可。如果可以,请使用pgrep查找PID。

脚本启动的其中一个命令可能是捕获SIGINT,这可能是 Ctrl C 无效的原因。但是,SIGKILL不能被捕获,它通常是最后手段选项。在进行kill之前,您可能想尝试SIGTERM-TERM)。 SIGKILLSIGTERM都不能设置为键盘快捷方式 SIGINT的方式是。

如果您的脚本不包含shebang行,那么这一切都没有实际意义。来自此SO答案

  

通常,父shell猜测脚本是为同一个shell编写的(最小的Bourne-like shell使用/ bin / sh运行脚本,bash将其作为bash子进程运行)...

因此,当执行脚本时,您将找不到以脚本命名的进程(或在命令行中具有脚本名称的进程),并且pgrep将失败。

始终使用shebang线。

作者:Community,muru

相关问答

添加新评论