출력 리디렉션이 중단되지 않도록 프로세스를 안전하게 종료하는 방법은 무엇입니까?

출력 리디렉션이 중단되지 않도록 프로세스를 안전하게 종료하는 방법은 무엇입니까?

일부 프로세스를 종료해야 하는 자동화 스크립트를 작성 중입니다.

이전에는 주로 프로세스를 종료했지만 , 한 번은 일부 프로세스를 종료 kill -9 pid할 때 다음과 같은 사실을 발견했습니다 .kill -9tcpdump

예를 들어:

tcpdump -i eth0 -w output.pcap

내가 잡은 가방은 넣지 않고 output.pcap비어 있었다. 하지만 사용하면 kill훌륭하게 작동합니다.

예를 들어 일부 프로세스의 경우 kill 프로세스를 ./prog >> test_log사용하면 kill -9출력이 로 리디렉션되지 않습니다 test_log.

kill또한 kill 명령을 사용하지 않으면 -9사용이 실패할 수도 있다는 걱정도 있습니다 .

kill죽이는 것이 출력 파일에 문제를 일으키지 않고 아무 문제 없이 프로세스를 죽일 수 있도록 올바르게 사용하는 방법을 알려주실 수 있는 분 계십니까 ?

답변1

프로세스가 터미널에 쓰지 않고 리디렉션을 사용하는 경우(또는 명시적으로 파일에 쓰는 경우에도) 버퍼링이 문제가 될 수 있습니다. stdbufunbuffer( )를 확인 expect하거나 여기에서 검색하세요.

이 플래그를 사용하면 문제 tcpdump를 해결하거나 줄일 수 있습니다 -U.

일반적으로 말하면, 다음과 같이 죽여야 합니다:

kill $PID; sleep $wait; kill -9 $pid &>/dev/null

kill/는 메모리 및 프로세스 목록에서 프로세스를 제거하는 kill -TERM대신 프로세스를 깔끔하게 완료할 수 있는 기회를 제공합니다(예: 버퍼 플러시 및 파일 설명자 닫기 포함) kill -KILL. 이는 당시 진행 중일 수 있는 비원자적 작업에 항상 위험합니다. .

답변2

먼저 중단 명령 대기 15(중단이 없는 경우) kill 2등을 실행해야 합니다.

일반적으로 말하자면, 예외를 제외하고 정상적으로 실행되는 경우 프로그램이 15,2,1을 종료한 후에도 종료되지 않으면 이는 최선의 신호가 아닙니다. 즉시 끝날 것이라고 기대할 수는 없지만.

둘째, 종료하려는 특정 프로그램에 따라 다릅니다. 일부 프로그램은 캡처하고 정리하고, 일부는 캡처하고 정리해야 하지만 일부는 정리할 것이 없고 운영 체제에서 정리하도록 남겨둡니다. 등.

또한 (항상) 애플리케이션에 보낼 수 있는 다른 신호가 있는지 확인해야 합니다. 또는 데몬인 경우 일반적으로 시작/중지 스크립트 등이 있습니다.

또한보십시오:

관련 정보