리눅스 프로세스에 대한 질문

-@Naver의 이미지

제가 실험으로 bash에서 test라는 프로그램을 실행하고 bash를
강제 종료시켜 봤습니다 test.c의 코드는

#include <unistd.h>
#include <stdio.h>
 
int main(void) {
    printf("부모 PID : %d\n", getppid());
    for(;;);
 
    return 0;
}

이러합니다.

부모 프로세스의 PID를 출력하고 무한루프를 돌리게 되어 있습니다
실행 결과 부모 PID는 bash의 PID로 나온 것을 확인했고 그 후에
kill -9 [bash의PID] 명령으로 bash를 강제 종료하였더니 test가 같이 꺼졌습니다.
제가 아는 대로라면 부모 프로세스가 자식 프로세스보다 먼저 종료되었으니
test가 고아 프로세스가 되어 부모가 init으로 바뀌고 init에서 wait을 호출하여 test의 종료를
기다릴텐데 왜 test가 같이 종료되는지 궁금합니다

SIGKILL(9)은 시그널 핸들러로 등록할 수 없으므로 bash에서 SIGKILL을 처리할 수도 없을거라고 생각합니다

+(혹시나 해서 ./test &으로 실행시켜봤는데 이 경우에는 bash를 강제 종료해도 정상적으로 init이 부모가 되고
계속 실행됩니다)

chanik의 이미지

nohup 등으로 보호하지 않는 이상, 백그라운드 작업도 shell과 함께 죽는다고 알고 있었는데, 평소 알고있던 상식과 다른 결과여서 잠시 찾아보니 아래와 같은 글이 나오네요.

https://unix.stackexchange.com/a/318428

Quote:
When the shell exits, it might send the HUP signal to background jobs, and this might cause them to exit. The SIGHUP signal is only sent if the shell itself receives a SIGHUP, i.e. only if the terminal goes away (e.g. because the terminal emulator process dies) and not if you exit the shell normally (with the exit builtin or by typing Ctrl+D)

shell이 SIGHUP을 받은 경우에만 자식프로스세스들에게 SIGHUP이 전달된다는 뜻같습니다. shell 종료방식 별로 간단히 실험해보니, 해당 shell에서 실행중이던 백그라운드 프로세스들의 운명은 아래와 같았습니다.

[1] putty 등의 터미널 종료버튼을 눌러 끔 (SIGHUP 발생) : 백그라운드 프로세스들도 뒤따라 종료됨
[2] kill -HUP 으로 종료 : 역시 따라 종료됨
[3] exit, ctrl-d, kill -9 등으로 종료 : 백그라운드 프로세스들 유지됨

위의 [1]과 [2]는 SIGHUP 발생 면에서 같은 맥락인 것을 아래 페이지를 통해 알 수 있습니다.

https://en.wikipedia.org/wiki/SIGHUP

Quote:
On POSIX-compliant platforms, SIGHUP ("signal hang up") is a signal sent to a process when its controlling terminal is closed.

chanik의 이미지

다시 읽어보니 질문의 요지는 shell이 죽을 때 왜 자식프로세스가 따라 죽는가였네요. 저는 터미널 환경에서 shell 종료시 모든 자식들은 따라 죽는다고 믿고있었다보니 왜 백그라운드 자식은 안 죽었나에 촛점을 맞춰 딴소리를 했군요.



질문글의 실험을 login shell이 아닌 sub shell에서 해보시면, 포그라운드 자식프로세스도 ppid가 1로 바뀐채로 계속 살아있습니다. 부모프로세스가 죽었을 때의 일반적인 자식프로세스의 행동과 같은 패턴이죠.

그리고, 샘플에서 SIGHUP을 무시하도록 수정하시면 login shell에서도 포그라운드 자식이 죽지 않습니다. 결국 login shell이 SIGKILL로 죽을때 포그라운드 자식만 따라죽은 이유는, 어디선가 포그라운드 자식에게만 SIGHUP이 날아오기 때문인 셈이죠. 아래 페이지의 내용이 참고가 되겠습니다.

https://www.gnu.org/software/libc/manual/html_node/Termination-Internals.html#Termination-Internals
( 링크출처 : https://unix.stackexchange.com/questions/84737/in-which-cases-is-sighup-not-sent-to-a-job-when-you-log-out )

Quote:
When a process terminates for any reason—either because the program terminates, or as a result of a signal—the following things happen:
.
.
● If the process is a session leader that has a controlling terminal, then a SIGHUP signal is sent to each process in the foreground job, and the controlling terminal is disassociated from that session.

아래와 같이 요약할때, 질문의 답은 [2]가 되겠네요.
(사실 [2]는 shell 뿐 아니라 모든 프로세스의 공통 행동패턴으로 봐야겠습니다)

[1] shell이 SIGHUP을 받으면 백/포그라운드 자식들 모두에게 SIGHUP을 보내고 종료한다.
[2] shell이 다른 이유로 죽게 되면, shell이 터미널의 세션리더인 경우에 한해 포그라운드 자식들에게 SIGHUP을 보내고 종료한다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.