我在 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
那是什么原因呢?
你的方法有几个问题。
您检测流程的方式不可靠。一个进程可能
fluent
在它的命令行中,即使它不是你想要杀死的那个。例如,如果你调用你的 scriptkill-fluent
,它会自己杀死。永远不要仅仅根据它的名字杀死一个进程。这太不可靠了。杀死进程的最好方法是使用它自己的远程控制机制来发送退出命令。如果这不可能,请根据它打开的文件将其杀死
fuser
。执行二进制算作打开。例如,要杀死所有正在执行的进程/usr/bin/fluent
,请运行fuser -k /usr/bin/fluent
。如果您确实必须根据其命令行终止进程,请不要使用
grep
.ps … | grep …
可能包括 grep 进程:ps
命令和grep
命令并行运行,因此ps
可能会或可能不会列出grep
,具体取决于两个进程启动的相对速度。改为使用pkill
。至于
<defunct>
进程,别忘了杀死它们:它们已经死了。这就是“defunct”的意思:他们是僵尸。