我在 bash 脚本中添加了一个命令来终止进程,如下所示
#!/bin/bash
kill -9 $(ps ux | grep 'fluent' | awk '{print $2}')
当我运行脚本时,例如./mykill
,它没有效果
$ ps ux | grep fluent
ko 21690 0.0 0.0 112664 972 pts/3 S+ 15:28 0:00 grep --color=auto fluent
ko 26573 5.1 1.0 1743688 673592 ? Sl May14 836:08 /state/partition1/ans190/v190/fluent/cortex.19.0.0 -f fluent -cmd-port:35881:compute-0-4.local -workbench-session (fluent "3ddp -pshmem -host -alnamd64 -r19.0.0 -t16 -mpi=ibmmpi -path/state/partition1/ansys190/v190/fluent -ssh")
ko 26581 0.0 0.0 0 0 ? Z May14 0:00 [fluent] <defunct>
$
$
$ ~/mykill
Killed
$ ps ux | grep fluent
ko 21690 0.0 0.0 112664 972 pts/3 S+ 15:28 0:00 grep --color=auto fluent
ko 26573 5.1 1.0 1743688 673592 ? Sl May14 836:08 /state/partition1/ans190/v190/fluent/cortex.19.0.0 -f fluent -cmd-port:35881:compute-0-4.local -workbench-session (fluent "3ddp -pshmem -host -alnamd64 -r19.0.0 -t16 -mpi=ibmmpi -path/state/partition1/ansys190/v190/fluent -ssh")
ko 26581 0.0 0.0 0 0 ? Z May14 0:00 [fluent] <defunct>
但是,如果我在终端中运行该命令,它将杀死它们。
$ kill -9 $(ps ux | grep 'fluent' | awk '{print $2}')
-bash: kill: (21899) - No such process
$ ps ux | grep fluent
ko 21915 0.0 0.0 112664 972 pts/3 S+ 15:31 0:00 grep --color=auto fluent
那到底是什么原因呢?
答案1
您的方法存在几个问题。
您检测进程的方式并不可靠。一个进程可能fluent
在其命令行中,即使它不是您想要杀死的进程。例如,如果您调用 script kill-fluent
,它会自行终止。永远不要仅仅根据进程的名称来终止进程。这实在是太不靠谱了。
终止进程的最佳方法是使用其自身的远程控制机制发送退出命令。如果不可能,请根据打开的文件来杀死它fuser
。执行二进制文件算作打开它。例如,要终止所有正在执行的进程/usr/bin/fluent
,请运行fuser -k /usr/bin/fluent
。
如果您确实必须根据命令行终止进程,请不要使用grep
.ps … | grep …
可能包括 grep 进程:该ps
命令和该grep
命令并行运行,因此ps
可能会或可能不会列出,grep
具体取决于两个进程启动的相对速度。使用pkill
反而。
至于进程<defunct>
,忘记杀死它们:它们已经死了。这就是“不存在”的意思:他们是僵尸。