실행되지 않는 응용 프로그램을 시작했지만 계속 실행 중이므로 삭제할 수 없습니다. PID를 인쇄할 수 있지만 이를 사용하는 프로세스를 종료할 수는 없습니다.
~ $ ps ax | grep snappr | awk '{print $1}'
70824
~ $ kill $(ps ax | grep snappr | awk '{print $1}')
-bash: kill: (70832) - No such process
답변1
두 번의 시도에서 서로 다른 두 개의 PID를 얻었음을 확인하셨나요?
다음을 고려하십시오. 와 같은 명령을 입력하면 vi raven.txt
은 ps ax
명령을 표시하는 줄을 표시합니다 vi raven.txt
. 마찬가지로 와 같은 명령을 입력하면 grep snappr
는 ps ax
명령을 표시하는 줄을 표시합니다 grep snappr
. 그리고 해당 출력을 ps
을 통해 파이프하면 는 grep snappr
다음 grep
줄을 찾습니다 .그것은 그 자체를 설명하는 것입니다. 따라서 다음을 입력하면
$ ps ax | grep snappr | awk '{print $1}'
반복적으로 매번 다른 숫자를 인쇄합니다(PID를 인쇄하고 명령을 실행할 때마다 grep
새롭고 고유한 프로세스를 얻기 때문입니다).grep
마지막으로, kill
인수가 알려질 때까지 명령을 실행할 수 없다는 점을 고려하십시오. 인수가 알려지려면 $(ps ax | grep snappr | awk '{print $1}')
파이프라인이 완료되어야 합니다. 이는 가 1 을grep
종료했음을 의미합니다 . 따라서 에는 프로세스 의 PID가 제공되지만 프로세스가 종료된 후에만 제공됩니다 . 따라서 자연스럽게 "해당 프로세스가 없습니다"라고 보고됩니다.kill
grep
grep
snappr
아마도 실행 중인 프로세스가 없다고 언급했어야 했을 것입니다 . 있는 경우 첫 번째 명령은 두 개의 숫자, 즉 PID snappr
와 PID를 출력합니다 grep snappr
. 이제 snappr
실행 중인 경우 명령이 반쯤 올바르게 실행되기 시작할 수 있습니다. 이는 원하는 작업을 수행하지만 오류 메시지도 표시한다는 의미입니다. 가 snappr
PID 42097로 실행 중이고 grep snappr
PID 70848로 실행되는 경우 명령 은 kill
가 되며 더 이상 존재하지 않는 프로세스를 종료하려고 하면 오류 메시지가 표시됩니다 .kill 42097 70858
snappr
grep
아마도 이 부분을 개선하고 싶을 것입니다. 제가 20년 전에 발명한 제가 가장 좋아하는 방법 grep
은 를 로 변경하는 것입니다. grep "[s]nappr"
이 방법은 일치 snappr
하지만 자체적으로는 일치하지 않습니다. 또 다른 접근 방식 pgrep
은 ps | grep
.
1 또는 단순히 표준 출력을 awk
닫으면 종료될 수 있습니다 grep
. 이는 *nix 프로그램에서는 매우 특이한 동작입니다.
답변2
짧은 답변
Bash 후프를 뛰어넘어 로 죽이거나 snappr
, ps
파이프를 통과 grep
한 다음 awk
그렇게 파이프를 통과하지 마십시오. 대신 다음을 사용하여 이렇게 죽이십시오.pkill
; 혼란스럽거나 소란스럽지 않으며 즉시 프로세스 이름을 기반으로 대상을 지정합니다.
sudo pkill snappr
더 긴 답변
방법이 너무 명확하지 않음도미시스템 프로세스 수준에서 작동하지만 문제는 상위 프로세스 ID 대신 하위 프로세스 ID만 가져오는 것일 수 있습니다.
실제로 프로세스 ID( )를 가져오는 데 사용하는 방법은 상위인지 하위인지에 관계없이 ps ax | grep snappr | awk '{print $1}'
연결된 프로세스 ID의 전체 목록을 반환할 것이라고 생각합니다. snappr
그래서 그걸 이용하면~할 것 같다하위 프로세스 ID인 하나의 프로세스 ID를 종료하지만 상위 ID는 여전히 활성화되어 보상을 위해 다른 하위 프로세스를 "생성"할 수 있습니다.
따라서 공급한 프로세스 ID의 최종 상위 ID를 가져와서 조치를 취하기 위해 이와 같은 작업을 수행할 수 있습니다. 작동 방식에 대한 간단한 개념 증명:
ps -p [process ID] -o ppid=
Bash에서 해당 명령을 실행하면 입력한 하위 프로세스 ID의 상위 프로세스 ID가 제공됩니다 [process ID]
. 따라서 하위 ID 4567
에 상위 프로세스 ID가 있는 경우 123
명령은 다음과 같습니다.
ps -p 4567 -o ppid=
그러면 123
.
즉, 스크립트가 의 실제 상위 프로세스 ID를 가져오는 경우 snapper
해당 프로세스 ID의 상위가 실제로 자신의 Bash 셸일 수 있으므로 이는 이탈 프로세스를 처리하는 위험한 방법일 수 있습니다. 따라서 프로세스를 실행 snapper
중인 동안 시스템을 종료하는 대신 실수로 Bash 셸을 종료할 수도 있습니다 snapper
.
하지만 말했잖아, 인생을 더 쉽게 만들고 그냥 달리는 게 어때?pkill
이와 같이:
sudo pkill snappr
snappr
그러면 멋진 명령줄 저글링 없이 연결된 모든 프로세스가 종료됩니다 .