您别无选择。一种是停止脚本(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
),然后再进行杀死。无论是SIGKILL
或SIGTERM
可以被设置为快捷键的方式SIGINT
是。
如果您的脚本不包含shebang行,那么所有这些都没有意义。从这个SO答案:
通常,父外壳会猜测脚本是为同一外壳编写的(最小的类似于Bourne的外壳使用/ bin / sh运行脚本,bash将其作为bash子进程运行)...
因此,执行脚本时,将找不到以脚本命名的进程(或在命令行中具有脚本名称的进程),并且pgrep
将失败。
始终使用射棒线。
Ctrl + z