작업 관리자에서 실행 중이지만 아직 보이지 않는 프로세스를 종료할 수 없습니다.

작업 관리자에서 실행 중이지만 아직 보이지 않는 프로세스를 종료할 수 없습니다.

실행되지 않는 응용 프로그램을 시작했지만 계속 실행 중이므로 삭제할 수 없습니다. 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.txtps ax명령을 표시하는 줄을 표시합니다 vi raven.txt. 마찬가지로 와 같은 명령을 입력하면 grep snapprps 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가 제공되지만 프로세스가 종료된 후에만 제공됩니다 . 따라서 자연스럽게 "해당 프로세스가 없습니다"라고 보고됩니다.killgrepgrep

snappr아마도 실행 중인 프로세스가 없다고 언급했어야 했을 것입니다 . 있는 경우 첫 번째 명령은 두 개의 숫자, 즉 PID snappr와 PID를 출력합니다 grep snappr. 이제 snappr실행 중인 경우 명령이 반쯤 올바르게 실행되기 시작할 수 있습니다. 이는 원하는 작업을 수행하지만 오류 메시지도 표시한다는 의미입니다. 가 snapprPID 42097로 실행 중이고 grep snapprPID 70848로 실행되는 경우 명령 은 kill가 되며 더 이상 존재하지 않는 프로세스를 종료하려고 하면 오류 메시지가 표시됩니다 .kill 42097 70858snapprgrep

아마도 이 부분을 개선하고 싶을 것입니다. 제가 20년 전에 발명한 제가 가장 좋아하는 방법 grep은 를 로 변경하는 것입니다. grep "[s]nappr"이 방법은 일치 snappr하지만 자체적으로는 일치하지 않습니다. 또 다른 접근 방식 pgrepps | 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그러면 멋진 명령줄 저글링 없이 연결된 모든 프로세스가 종료됩니다 .

관련 정보