일부 프로세스를 종료해야 하는 자동화 스크립트를 작성 중입니다.
이전에는 주로 프로세스를 종료했지만 , 한 번은 일부 프로세스를 종료 kill -9 pid
할 때 다음과 같은 사실을 발견했습니다 .kill -9
tcpdump
예를 들어:
tcpdump -i eth0 -w output.pcap
내가 잡은 가방은 넣지 않고 output.pcap
비어 있었다. 하지만 사용하면 kill
훌륭하게 작동합니다.
예를 들어 일부 프로세스의 경우 kill 프로세스를 ./prog >> test_log
사용하면 kill -9
출력이 로 리디렉션되지 않습니다 test_log
.
kill
또한 kill 명령을 사용하지 않으면 -9
사용이 실패할 수도 있다는 걱정도 있습니다 .
kill
죽이는 것이 출력 파일에 문제를 일으키지 않고 아무 문제 없이 프로세스를 죽일 수 있도록 올바르게 사용하는 방법을 알려주실 수 있는 분 계십니까 ?
답변1
프로세스가 터미널에 쓰지 않고 리디렉션을 사용하는 경우(또는 명시적으로 파일에 쓰는 경우에도) 버퍼링이 문제가 될 수 있습니다. stdbuf
및 unbuffer
( )를 확인 expect
하거나 여기에서 검색하세요.
이 플래그를 사용하면 문제 tcpdump
를 해결하거나 줄일 수 있습니다 -U
.
일반적으로 말하면, 다음과 같이 죽여야 합니다:
kill $PID; sleep $wait; kill -9 $pid &>/dev/null
kill
/는 메모리 및 프로세스 목록에서 프로세스를 제거하는 kill -TERM
대신 프로세스를 깔끔하게 완료할 수 있는 기회를 제공합니다(예: 버퍼 플러시 및 파일 설명자 닫기 포함) kill -KILL
. 이는 당시 진행 중일 수 있는 비원자적 작업에 항상 위험합니다. .
답변2
먼저 중단 명령 대기 15
(중단이 없는 경우) kill 2
등을 실행해야 합니다.
일반적으로 말하자면, 예외를 제외하고 정상적으로 실행되는 경우 프로그램이 15,2,1을 종료한 후에도 종료되지 않으면 이는 최선의 신호가 아닙니다. 즉시 끝날 것이라고 기대할 수는 없지만.
둘째, 종료하려는 특정 프로그램에 따라 다릅니다. 일부 프로그램은 캡처하고 정리하고, 일부는 캡처하고 정리해야 하지만 일부는 정리할 것이 없고 운영 체제에서 정리하도록 남겨둡니다. 등.
또한 (항상) 애플리케이션에 보낼 수 있는 다른 신호가 있는지 확인해야 합니다. 또는 데몬인 경우 일반적으로 시작/중지 스크립트 등이 있습니다.
또한보십시오: