프로세스를 정상적으로 종료하려면 어떤 순서로 신호를 보내야 합니까?
다른 질문의 답변에 대한 코멘트에서 코멘트는 다음과 같습니다.
꼭 필요한 경우가 아니면 9번 킬을 사용하지 마세요!SIGKILL을 가둘 수 없기 때문에 죽은 프로그램이 임시 파일을 삭제하는 종료 루틴을 실행할 수 없습니다.먼저 HUP(1), 다음으로 INT(2), 다음으로 QUIT(3)를 시도합니다.
대해서는 SIGKILL
이치노에 의해 kill
SIGTERM
임의의 프로세스를 정상적으로 셧다운하기 위한 가장 일반적인 신호라고 생각합니다.저는 , 는, 는, 는, 이, 이, 다, also, also, also, also, also, also.SIGHUP
그리고 내가 보기엔SIGINT
(일반적으로 Ctrl+C에서 발생하는 인터럽트와 같은 인터럽트죠?)가 필요한 만큼 폭넓게 지원되지 않거나 다소 부적절하게 종료됩니다.
SIGKILL
is last resort : 가능한 한 정상적으로 셧다운하기 위해 어떤 신호를 어떤 순서로 임의의 프로세스에 송신해야 합니까?
가능한 경우, 뒷받침하는 사실(개인적인 선호나 의견 외) 또는 참고 자료를 사용하여 답변을 입증해 주십시오.
주의: 특히 bash/Cygwin을 고려한 베스트 프랙티스에 관심이 있습니다.
편집: 지금까지 INT나 KIT에 대해서는 아무도 언급하지 않은 것 같고 HUP에 대해서도 언급이 한정되어 있습니다.이것들을 순서 있는 프로세스 킬링에 포함할 이유가 있습니까?
SIGTERM은 응용 프로그램에 종료 명령을 내립니다.다른 신호는 셧다운과는 무관하지만 경우에 따라서는 같은 결과를 초래할 수 있는 다른 것들을 애플리케이션에 알려줍니다.그런 거 쓰지 마.애플리케이션을 셧다운 하려면 , 셧다운 하도록 지시합니다.오해의 소지가 있는 신호를 보내지 마세요.
일부 사람들은 프로세스를 종료하는 현명한 표준 방법은 HUP, INT, TERM, 그리고 마지막으로 KILL과 같은 많은 신호를 보내는 것이라고 믿고 있습니다.이거 점점 우스워진다.종료에 적합한 신호는 SIGTERM이며, SIGTERM이 프로세스를 즉시 종료하지 않는 경우, 이는 애플리케이션이 신호 처리를 선택했기 때문입니다.즉, 즉시 종료하지 않아도 되는 타당한 이유가 있는 것입니다.청소해야 할 일이 있다.정리 작업을 다른 신호와 함께 중단하면 메모리에서 아직 디스크에 저장되지 않은 데이터, 중단된 클라이언트 애플리케이션 또는 "중간" 중단 여부를 알 수 없습니다. 이는 사실상 데이터 손상입니다.
신호의 진정한 의미에 대한 자세한 내용은 sigaction(2)을 참조하십시오."Default Action"과 "Description"은 동일하지 않습니다.
SIGINT
는 프로세스의 인터랙티브한 "인터럽트" 신호를 보내는 데 사용됩니다.일부 프로그램은 터미널 사용자의 목적을 위해 특별한 방식으로 이 상황을 처리할 수 있습니다.
SIGHUP
는 단말기가 없어지고 프로세스를 보고 있지 않음을 나타내는 데 사용됩니다.가 없기 등 다른 프로세스도 .프로세스에 따라서는 셧다운을 선택하는 경우도 있습니다.일반적으로 단말기가 없으면 조작이 의미가 없기 때문에 컨피규레이션파일 재체크 등 다른 작업을 하는 경우도 있습니다.
SIGKILL
커널에서 프로세스를 강제로 제거하기 위해 사용됩니다.이것은 실제로 프로세스에 대한 신호가 아니라 커널에 의해 직접 해석된다는 점에서 특별합니다.
시그킬을 보내지 마SIGKILL
스크립트에 의해 송신되는 것은 절대로 아닙니다. 프로그램이 "Drught"를하는 경우SIGTERM
청소하는 데 1초, 1분, 1시간 정도 걸릴 수 있습니다.애플리케이션이 종료되기 전에 무엇을 완료해야 하는지에 따라 달라집니다.응용 프로그램의 정리 시퀀스가 충분히 오래 걸리고 X초 후에 바로 가기 또는 SIGKILL이 필요하다고 가정하는 논리는 완전히 잘못된 것입니다.
응용 프로그램에 필요한 유일한 이유는SIGKILL
끝내는 것, 즉 청소 과정에서 도청장치가 고장났을 경우입니다. " " " 를 열 수 .SIGKILL
수동으로 합니다., 당신이 '나'를 선택한 요.SIGKILL
스스로 정화하는 것을 막고 싶기 때문입니다.
으로 보내도SIGKILL
에도 그것은 잘못된 이다.5초가 지났는데도 끔찍하게 잘못된 행동이에요
단답: 송신SIGTERM
후 , 30초 후,SIGKILL
,, 신, 송, 송, 다, 다, 다SIGTERM
잠시 기다려 주십시오(프로그램에 따라 다를 수 있습니다.시스템을 더 잘 알 수 있지만 5~30초 정도면 충분합니다).기계를 종료할 때 자동으로 1시 30분까지 대기하는 것을 볼 수 있습니다. 서두르세요 나서 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.SIGKILL
.
적절한 답변:SIGTERM
,SIGINT
,SIGKILL
이 정도면 충분합니다.프로세스는 아마 다음 시간 전에 종료될 것입니다.SIGKILL
.
장황한 답변:SIGTERM
,SIGINT
,SIGQUIT
,SIGABRT
,SIGKILL
이것은 불필요하지만, 적어도 당신은 당신의 메시지에 관한 과정을 오해하지는 않습니다.이 모든 신호는 프로세스가 동작을 중지하고 종료해야 함을 의미합니다.
이 설명에서 어떤 답을 선택하든 명심하세요!
다른 의미를 갖는 신호를 보내는 경우 프로세스가 매우 다른 방식으로 처리할 수 있습니다.한편, 프로세스가 신호를 처리하지 않는 경우는, 송신하는 내용에 관계없이, 프로세스는 종료합니다(물론 디폴트액션이 종료하는 경우).
그래서 프로그래머로서 자기 자신을 생각해야 한다. 함수 하시겠습니까?SIGHUP
연결 프로그램을 종료하거나 다시 연결하도록 루프하시겠습니까?게여여 기가장장 !요!! !!!!!!그렇기 때문에 의도한 대로 신호를 보내는 것이 중요합니다.
거의 바보 같은 긴 답변:
아래 표에는 관련 신호와 프로그램이 처리하지 않을 경우의 기본 조치가 포함되어 있습니다.
꼭 시험해 볼 필요가 있는 경우는, 제가 추천하는 순서로 주문했습니다(BTW, 여기에 있는 것이 아니라, 합리적인 답변을 사용하는 것을 추천합니다). (테이블은 파괴의 관점에서 주문되어 있다고 하는 것은 재미있지만, 그것은 완전히 사실이 아닙니다).
아스타리스크(*)가 붙은 신호는 권장하지 않습니다.여기서 중요한 것은 이 프로그램이 무엇을 하도록 프로그램되어 있는지 알 수 없다는 것입니다.특별히SIGUSR
! 그것은 아포칼립스를 시작할 수 있다(프로그래머가 원하는 것은 무엇이든 할 수 있는 무료 신호이다!).단, OR을 처리하지 않은 경우 종료 처리되지 않을 경우 프로그램은 종료됩니다.
표에서는 및 옵션을 . 신호는 종료 에 남습니다.SIGKILL
.
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
그리고 나는 거의 바보 같은 긴 대답을 제안하고 싶다.SIGTERM
,SIGINT
,SIGHUP
,SIGPIPE
,SIGQUIT
,SIGABRT
,SIGKILL
그리고 마지막으로
확실히 멍청한 장황한 답변:
집에서 시도하지 마세요.
SIGTERM
,SIGINT
,SIGHUP
,SIGPIPE
,SIGALRM
,SIGUSR2
,SIGUSR1
,SIGQUIT
,SIGABRT
,SIGSEGV
,SIGILL
,SIGFPE
것도 안 되면 and무 and and and and andSIGKILL
.
SIGUSR2
해 보아야 한다SIGUSR1
왜냐하면 프로그램이 신호를 처리하지 않으면 우린 더 잘 살거든요. 그것이 더잘 다룰 수 것 같습니다.SIGUSR1
그중면면 면면면면면면
참고로, KILL: 송신하는 것은 잘못된 것이 아닙니다.SIGKILL
프로세스로 이행할 수 있습니다.요?shutdown
명령어?할 수 있다SIGTERM
★★★★★★★★★★★★★★★★★」SIGKILL
일한한고고고고고고고고고고고고고? 바로 그 신호인데 왜 다른 하죠?shutdown
명령어는 이 두 가지만 사용합니다.
자, 긴 답변으로 돌아가자면, 이것은 멋진 오닐라이너입니다.
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
신호 사이에 30초 동안 잠을 잔다.아니면 왜 오넬라이너가 필요하죠?;)
신호만 사용하여 시험해 .15 2 9
합리적인 답변에서.
안전: 두 번째를 제거합니다.echo
당신이 갈 준비가 되면.는 그것을 의 것이라고 .dry-run
온라이너용입니다.항상 테스트에 사용합니다.
스크립트 killgraceally
사실 저는 이 질문에 너무 흥미를 느껴서그걸 하기 위해서 작은 대본을 만들기로 했어요여기서 다운로드(클론 작성)해 주세요.
Killgracefull 저장소에 대한 GitHub 링크
상, 신, 송, 송, 습, 습, 습, 습을 보냅니다.SIGTERM
의 디폴트, kill ( kill ) 。이치노 내에 되지 않는 에만, 「종료할 수 없다」에 가 있습니다.SIGKILL
단, 이 점에 주의해 주십시오.SIGKILL
프로그램은 데이터를 정리할 가능성이 없으며 데이터가 손상될 수 있습니다.
★★★★★★에 대해서SIGHUP
,HUP
는 "hang up"의 약자로, 이전에는 모뎀이 절단되었음을 의미합니다.으로는 '비슷하게 하다'와 SIGTERM
이 가끔 SIGHUP
새로고침 때문에 데몬이 입니다.따라서 데몬이 수신되지 .SIGHUP
그 때문에, 그 신호는 일반적인 용도로 「업」된 것으로 간주되고 있습니다.모든 데몬이 새로고침에 이 기능을 사용하는 것은 아닙니다!SAHUP의 기본 액션은 종료이며 많은 데몬이 이와 같이 동작합니다. 러러무 blindly blindly 를 보낼 수는 SIGHUP
생존을 기대하면서 사는 거죠
★★★★ SIGINT
보통 종료에 적합하지 않을 수 있습니다.일반적으로 프로세스 종료는^C
터미널 설정이 무엇이든 간에 프로그램을 중단합니다.많은 프로그램에서 이 기능을 자체 목적으로 캡처하기 때문에 작동하지 않는 경우가 많습니다. SIGQUIT
에는 일반적으로 코어 덤프를 생성하는 기본값이 있습니다.코어 덤프 주위에 코어 파일을 배치하는 것을 원하지 않는 한 이 후보도 않습니다.
: " " " 를 : " "SIGTERM
되지 않고,을 송신합니다.SIGKILL
.
SIGTERM
사실, 신청서에 메시지를 보내는 것을 의미합니다. "친절하게 자살해 주시겠습니까?"이를 응용 프로그램에서 트랩 및 처리하여 정리 및 종료 코드를 실행할 수 있습니다.
SIGKILL
응용 프로그램에서 트랩할 수 없습니다.애플리케이션을 정리할 기회 없이 OS에 의해 정지됩니다.
상, 신, 는, ,, 신, 신, it, it, it, it, it, it, itSIGTERM
잠을, 다시 한 번, 다시 한 번, 다시 한 번, 다시 한 번 보내 주세요.SIGKILL
.
- SIGTERM은 창에서 "X"를 클릭하는 것과 같습니다.
- SIGTERM은 Linux가 셧다운할 때 가장 먼저 사용합니다.
모든 논의가 진행되고 있는 가운데, 어떠한 코드도 제시되지 않았습니다.제 생각은 이렇습니다.
#!/bin/bash
$pid = 1234
echo "Killing process $pid..."
kill $pid
waitAttempts=30
for i in $(seq 1 $waitAttempts)
do
echo "Checking if process is alive (attempt #$i / $waitAttempts)..."
sleep 1
if ps -p $pid > /dev/null
then
echo "Process $pid is still running"
else
echo "Process $pid has shut down successfully"
break
fi
done
if ps -p $pid > /dev/null
then
echo "Could not shut down process $pid gracefully - killing it forcibly..."
kill -SIGKILL $pid
fi
HUP는 나에게 쓰레기처럼 들린다.데몬이 설정을 다시 읽도록 보내겠습니다.
SIGTERM은 감청할 수 있습니다.데몬은 신호를 수신했을 때 실행할 정리 코드를 가지고 있을 수 있습니다.SIGKILL에 대해서는 그럴 수 없습니다.따라서 SIGKILL에서는 데몬 작성자에게 옵션을 제공하지 않습니다.
자세한 내용은 Wikipedia를 참조하십시오.
언급URL : https://stackoverflow.com/questions/690415/in-what-order-should-i-send-signals-to-gracefully-shutdown-processes
'programing' 카테고리의 다른 글
npm을 사용하여 bash 스크립트 실행 (0) | 2023.04.11 |
---|---|
Python Panda를 사용하여 기존 Excel 시트를 새 데이터 프레임에 추가 (0) | 2023.04.11 |
Excel 데이터를 Firebase에 저장하려면 어떻게 해야 하나요? (0) | 2023.04.11 |
Unix 에서는, 현재의 디렉토리와 그 아래에 있는 모든 것을 어떻게 삭제합니까? (0) | 2023.04.11 |
xy 산점도에서 열 값에 따라 점을 색칠하려면 어떻게 해야 합니까? (0) | 2023.04.11 |