아래와 같이 프로세스를 종료하기 위해 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
종료하려는 프로세스가 아니더라도 프로세스가 명령줄에 있을 수 있습니다 . 예를 들어 스크립트를 호출하면 kill-fluent
자체적으로 종료됩니다.이름만으로 프로세스를 종료하지 마십시오.. 이것은 정말 신뢰할 수 없습니다.
프로세스를 종료하는 가장 좋은 방법은 자체 원격 제어 메커니즘을 사용하여 종료 명령을 보내는 것입니다. 가능하지 않은 경우 열린 파일을 기반으로 종료하십시오.fuser
. 바이너리를 실행하면 바이너리를 여는 것으로 간주됩니다. 예를 들어, 실행 중인 모든 프로세스를 종료하려면 /usr/bin/fluent
를 실행합니다 fuser -k /usr/bin/fluent
.
명령줄을 기반으로 프로세스를 종료해야 하는 경우 를 사용하지 마십시오 grep
. ps … | grep …
grep 프로세스가 포함될 수 있습니다. 이 ps
명령과 이 grep
명령은 병렬로 실행되므로 두 프로세스의 상대 속도에 따라 ps
나열될 수도 있고 그렇지 않을 수도 있습니다. grep
시작되었습니다. 사용pkill
대신에.
프로세스에 관해서는 <defunct>
그들을 죽이는 것을 잊어버리십시오: 그들은 이미 죽었습니다. 이것이 "존재하지 않는다"는 의미입니다: 그들은 존재합니다좀비.