我编写了一个bash脚本,该脚本调用其他几个程序并执行一堆命令。我从终端运行此脚本。现在我想杀死脚本。
Ctrl + C我认为有时按一下并不会削减它,因为有时脚本正在执行另一个程序,并且由于某种原因,kill信号不起作用。
但是,如果我关闭终端窗口,它将终止脚本。
有什么我可以做的(键盘组合),类似于关闭终端窗口,而无需实际关闭终端窗口(我不想丢失命令历史记录,当前目录,输出历史记录等)吗?
Ctrl + z运行后:kill -9 $(pgrep -f your_script.sh)
我编写了一个bash脚本,该脚本调用其他几个程序并执行一堆命令。我从终端运行此脚本。现在我想杀死脚本。
Ctrl + C我认为有时按一下并不会削减它,因为有时脚本正在执行另一个程序,并且由于某种原因,kill信号不起作用。
但是,如果我关闭终端窗口,它将终止脚本。
有什么我可以做的(键盘组合),类似于关闭终端窗口,而无需实际关闭终端窗口(我不想丢失命令历史记录,当前目录,输出历史记录等)吗?
Ctrl + z运行后:kill -9 $(pgrep -f your_script.sh)
Answers:
您别无选择。一种是停止脚本(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将失败。
始终使用射棒线。
SIGKILL或的键盘组合SIGTERM?
pgrep test.sh不会为我返回PID。我尝试了一个简单的test.sh: for i in {1..30}; do sleep 1 echo $i done 在test.sh运行时,我pgrep test.sh在另一个终端上执行,但是什么也没有返回。怎么了?
pgrep -f test.sh。
pgrep -f test.sh也不起作用。我使用./test.sh
如果您知道与脚本关联的进程,则可以使用以下命令找到其PID
ps -A
然后使用PID号使用以下命令杀死相应的进程
kill -9 PID_Number
正如哈里斯说的那样,您可以运行,Kill -9 PID_Number但您也可以安装该软件包,htop以使其具有一个交互式的过程浏览器,从而使查找特定过程变得更加容易。htop还支持杀死进程。
Ctrl + z