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


35

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

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

但是,如果我关闭终端窗口,它将终止脚本。

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


8
在这种情况下,我会尝试Ctrl + z
kenn

Ctrl + z运行后:kill -9 $(pgrep -f your_script.sh)
Noam Manos

Answers:


38

您别无选择。一种是停止脚本(CtrlZ),获取脚本的PID,然后将其发送SIGKILL到进程组。

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

kill -PID

PID脚本的进程ID 在哪里。

例:

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

$ ./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,因此此命令等效CtrlC于在终端上按。发送SIGKILL

kill -KILL -17802

仅在无法打开另一个终端时才需要停止脚本。如果可以,使用pgrep查找PID。

脚本启动的命令之一可能是trapping SIGINT,这可能CtrlC是无效的原因。但是,SIGKILL不能将其困住,通常是最后一种选择。您可能要先尝试SIGTERM-TERM),然后再进行杀死。无论是SIGKILLSIGTERM可以被设置为快捷键的方式SIGINT是。

如果您的脚本不包含shebang行,那么所有这些都没有意义。从这个SO答案

通常,父外壳会猜测脚本是为同一外壳编写的(最小的类似于Bourne的外壳使用/ bin / sh运行脚本,bash将其作为bash子进程运行)...

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

始终使用射棒线。


是否有SIGKILL或的键盘组合SIGTERM
becko 2014年

@becko不,您不能设置一个:superuser.com/a/417991/334516
muru

pgrep test.sh不会为我返回PID。我尝试了一个简单的test.sh: for i in {1..30}; do sleep 1 echo $i donetest.sh运行时,我pgrep test.sh在另一个终端上执行,但是什么也没有返回。怎么了?
becko 2014年

1
@becko您是如何运行脚本的?也尝试一下pgrep -f test.sh
muru 2014年

pgrep -f test.sh也不起作用。我使用./test.sh
becko

6

如果您知道与脚本关联的进程,则可以使用以下命令找到其PID

 ps -A

然后使用PID号使用以下命令杀死相应的进程

 kill -9 PID_Number

1
太复杂了。该脚本生成其他几个程序,这些程序也生成并行进程。跟踪所有这些过程非常困难。必须有一个更简单的解决方案,类似于关闭终端窗口时发生的事情。
becko 2014年

你能试试pkill -P $$
哈里斯

1

正如哈里斯说的那样,您可以运行,Kill -9 PID_Number但您也可以安装该软件包,htop以使其具有一个交互式的过程浏览器,从而使查找特定过程变得更加容易。htop还支持杀死进程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.