bash 脚本中的命令无效

bash 脚本中的命令无效

我在 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>,忘记杀死它们:它们已经死了。这就是“不存在”的意思:他们是僵尸

相关内容