1. 개념

1. 1 nohup

    • 리눅스에서 nohup(no hang up) 명령어는 터미널 세션이 종료되어도 백그라운드에서 프로세스를 계속 실행시킬 때 사용
    • 일반적으로 터미널을 닫거나 로그아웃하면 해당 세션에서 실행 중인 프로세스도 종료되지만, nohup을 사용하면 프로세스가 중단되지 않고 계속 실행
    • 주로 서버 작업이나 오래 걸리는 백그라운드 작업에 유용
    • (command 예시) nohup과 &
    • $nohup [명령어] & 터미널 세션을 유지한 상태로 명시적인 파일에 출력, 
      & 기호는 해당 명령어를 백그라운드에서 실행되도록 함
      $nohup [명령어] > [출력 파일] 2>&1 & nohup은 기본적으로 nohup.out 파일에 표준출력(stdout)을 쓰기 때문에,
      2>&1 명령어를 사용하면 표준오류(stderr)도 nohup.out에 같이 쓴다.
      파일은 명령을 실행한 현재 디렉토리에 생성되며, 명시적으로 파일을 지정 가능
      0(표준 입력), 1(표준 출력), 2(표준 에러)
      $nohup {프로세스 및 실행 명령어} 1>/dev/null & log 생성하지 않기
      프로세스 실행 출력 결과를 /dev/null로 전달하여 버림(/dev/null 이 출력을 기록하지 않는 더미 장치)
      $nohup sh 1>/dev/null 2>/dev/null &test.sh 표준출력이든 표준오류든 아무 것도 쓰고 싶지 않다
      $nohup 명령어 2>&1 표준오류(stderr)를 표준출력(stdout)이 전달되는 곳으로 보내라
      $ nohup ./myscript.sh > output.log 2>&1 &
         [1] 12345
      myscript.sh의 실행 결과를 output.log 파일에 기록,
      2>&1은 표준 오류와 표준 출력을 같은 파일에 기록하도록 설정합니다
      [1] 12345는 백그라운드에서 실행 중인 작업의 작업 번호와 프로세스 ID
      $ nohup ./my_shellscript.sh 1 > my_shellscript.out 2 > my_shellscript.err & 표준출력과 표준에러를 다른 파일에 쓰기
      $ ps aux | grep myscript.sh
      • ps 명령어로 nohup으로 실행 중인 프로세스를 확인
      • ps aux는 Linux에서 실행 중인 프로세스의 정보를 표시하는 명령어
        • ps: 프로세스 상태(Process Status)를 확인하기 위한 명령어입니다.
        • a: 터미널에 연관되지 않은 모든 사용자 프로세스를 표시합니다.
        • u: 사용자 기반의 포맷으로 프로세스 정보를 표시합니다.
              프로세스 소유자, CPU 사용량, 메모리 사용량 등을 포함한 정보를 보여줍니다.
        • x: 세션에 속하지 않는 프로세스도 포함하여 모든 프로세스를 표시합니다.
      $ ps -ef 
      • nohup으로 실행한 프로세스는 ps 뒤에 -ef를 붙여야 확인 가능

2.2 FG와 BG

    • 현재 실행중인 프로그램을 백그라운드로 바꾸기
      - ^+Z : 일시 중단하고 shell로 빠져나옴
      - jobs : 백그라운드 조회, 번호와 커맨드 확인
      bg %1 : %잡번호를 입력하여 백그라운드로 재개시킴
      - fg %1 : 포그라운드로 재개
      - kill %1 : job 1번 강제 종료

 


nohup은 터미널 세션이 종료된 후에도 백그라운드에서 프로세스를 계속 실행시키기 위해 사용하는 명령어입니다. no hang up의 줄임말로, 터미널이 끊어질 때 발생하는 SIGHUP (Hangup) 신호를 무시하도록 합니다.


주요 기능 및 작동 방식

nohup은 다음 두 가지 주요 기능을 수행합니다.

  1. SIGHUP 신호 무시: 터미널이 닫히거나 연결이 끊어질 때, 셸은 하위 프로세스에 SIGHUP 신호를 보냅니다. 이 신호를 받은 프로세스는 기본적으로 종료됩니다. nohup은 이 신호를 무시하게 하여 프로세스가 계속 실행되도록 합니다.
  2. 출력 리디렉션: 프로세스가 터미널에 출력하는 메시지(표준 출력, 표준 에러)를 제어합니다. nohup을 사용하면 출력이 자동으로 nohup.out 파일로 리디렉션됩니다. 이 파일은 명령어를 실행한 디렉터리에 생성됩니다. 만약 해당 디렉터리에 쓰기 권한이 없으면 사용자의 홈 디렉터리에 생성됩니다.

사용법

nohup은 일반적으로 백그라운드 실행을 위한 & 기호와 함께 사용됩니다.

Bash
 
nohup [명령어] &
  • nohup: 명령어가 SIGHUP 신호에 반응하지 않도록 합니다.
  • [명령어]: 백그라운드에서 실행할 스크립트나 프로그램입니다.
  • &: 명령어를 즉시 백그라운드로 보냅니다. &를 사용하지 않으면 nohup만으로는 터미널이 종료될 때까지 프로세스가 포그라운드에 남아있게 됩니다.

예시

long_running_task.sh라는 스크립트를 백그라운드에서 실행하는 경우:

Bash
 
nohup ./long_running_task.sh &

이 명령어를 실행하면 다음과 같은 메시지가 출력될 수 있습니다.

nohup: ignoring input and appending output to 'nohup.out'
[1] 12345
  • ignoring input...: 입력은 무시하고, 출력은 nohup.out 파일에 기록한다는 의미입니다.
  • [1] 12345: [1]은 백그라운드 작업 번호이고, 12345는 프로세스 ID(PID)입니다.

nohup과 &의 관계

  • &만 사용: 프로세스가 백그라운드에서 실행되지만, 터미널이 종료되면 함께 종료됩니다.
  • nohup만 사용: 프로세스가 터미널을 종료해도 계속 실행되지만, 명령어가 포그라운드에서 실행되기 때문에 터미널을 점유합니다. 터미널을 다시 사용하려면 Ctrl + Z로 작업을 일시 중지하고 bg 명령어로 백그라운드에 보내야 하는 불편함이 있습니다.
  • nohup ... & 사용: 가장 일반적인 형태로, 명령어를 처음부터 백그라운드에서 실행하고 터미널 종료 후에도 계속 실행되도록 합니다.

nohup 대신 사용할 수 있는 도구

  • screen: 가상 터미널 세션을 만들어 여러 터미널을 관리할 수 있게 해줍니다. 세션을 detach(분리)한 후 터미널을 닫아도, 세션 내의 프로세스들은 계속 실행됩니다.
  • tmux: screen과 유사한 터미널 멀티플렉서로, 더 현대적이고 기능이 풍부합니다.
  • systemd 서비스: 백그라운드 프로세스를 안정적으로 관리해야 하는 경우, 시스템 서비스로 등록하여 실행하는 것이 가장 권장되는 방법입니다.

 

 

 

 

포그라운드(foreground)와 백그라운드(background)는 리눅스나 유닉스 기반 시스템에서 프로세스 실행 방식을 구분하는 용어입니다.


포그라운드 (Foreground)

포그라운드는 현재 터미널과 연결되어 사용자 상호작용이 가능한 상태의 프로세스입니다.

  • 특징:
    • 터미널을 점유하며, 다음 명령어를 입력하기 전까지 사용자가 기다려야 합니다.
    • 키보드 입력을 받을 수 있습니다 (예: 사용자 입력, Ctrl+C로 프로세스 종료).
    • 표준 출력(standard output)이 터미널 화면에 즉시 표시됩니다.
  • 예시: ls -al, ping google.com, vim file.txt 와 같이 대부분의 명령어를 실행하면 포그라운드에서 실행됩니다.
Bash
 
$ ping google.com
PING google.com (142.250.199.14) 56(84) bytes of data.
64 bytes from icn44s08-in-f14.1e100.net (142.250.199.14): icmp_seq=1 ttl=119 time=1.85 ms
...
^C  # Ctrl+C를 눌러 프로세스 종료

백그라운드 (Background)

백그라운드는 터미널과 분리되어 뒤에서 실행되는 프로세스입니다.

  • 특징:
    • 터미널을 점유하지 않아 사용자가 다른 명령어를 즉시 실행할 수 있습니다.
    • & 기호를 명령어 끝에 붙여 실행합니다.
    • 키보드 입력(Ctrl+C)으로 직접 제어할 수 없습니다.
  • 예시: 시간이 오래 걸리는 작업이나 지속적으로 실행해야 하는 서버 프로세스 등을 백그라운드에서 실행할 때 유용합니다.
Bash
 
$ find / -name "*.log" > find_result.log &
[1] 12345  # 작업 번호와 프로세스 ID(PID)가 표시됨

$ ps -ef | grep 12345  # 다른 작업 수행

포그라운드 ↔ 백그라운드 전환

  • 포그라운드 → 백그라운드: Ctrl+Z를 눌러 현재 포그라운드 작업을 일시 정지시키고, bg 명령어를 입력하여 백그라운드에서 다시 실행합니다.
  • 백그라운드 → 포그라운드: fg 명령어를 사용하여 백그라운드 작업을 다시 포그라운드로 가져올 수 있습니다. 작업 번호(%1)를 지정하여 특정 작업을 포그라운드로 가져올 수도 있습니다.

 

문제

다음 중 OOOO.sh &를 세 번 실행했을 때의 설명으로 옳지 않은 것을 고르세요.

Bash
 
OOOO.sh &
OOOO.sh &
OOOO.sh &

① 3개의 프로세스가 백그라운드에서 동시에 실행된다.

② 각 스크립트는 터미널이 종료되어도 계속 실행될 수 있다.

③ 각 스크립트 실행은 별도의 프로세스 ID(PID)를 가진다.

④ 터미널에 jobs 명령어를 입력하면 실행 중인 스크립트 목록을 확인할 수 있다.

⑤ 스크립트 실행 중에 Ctrl + C를 눌러도 모든 스크립트가 종료되지 않는다.


정답 및 해설

정답: ② 각 스크립트는 터미널이 종료되어도 계속 실행될 수 있다.

& 기호는 스크립트를 백그라운드에서 실행하게 하지만, 터미널 세션이 종료되면 기본적으로 함께 종료됩니다. 따라서 이 설명은 옳지 않습니다.

해설

  • ① 3개의 프로세스가 백그라운드에서 동시에 실행된다.
    • & 기호는 명령어를 백그라운드 작업으로 보냅니다. 따라서 세 번 실행하면 3개의 독립적인 백그라운드 프로세스가 동시에 실행됩니다.
  • ② 각 스크립트는 터미널이 종료되어도 계속 실행될 수 있다.
    • 오답입니다. 백그라운드 작업은 터미널 세션의 하위 프로세스로 간주되므로, 터미널이 종료되면 SIGHUP 신호(Hangup signal)를 받고 함께 종료됩니다. 터미널 종료 후에도 작업을 계속 실행하려면 nohup이나 disown, 또는 screen, tmux와 같은 별도의 도구가 필요합니다.
  • ③ 각 스크립트 실행은 별도의 프로세스 ID(PID)를 가진다.
    • 각 스크립트는 독립적인 프로세스로 실행되므로, 각각 고유한 PID가 할당됩니다.
  • ④ 터미널에 jobs 명령어를 입력하면 실행 중인 스크립트 목록을 확인할 수 있다.
    • jobs 명령어는 현재 셸에서 백그라운드로 실행 중인 작업들의 목록을 보여줍니다. 따라서 이 설명은 맞습니다.
  • ⑤ 스크립트 실행 중에 Ctrl + C를 눌러도 모든 스크립트가 종료되지 않는다.
    • Ctrl + C는 현재 포그라운드에서 실행 중인 작업에만 SIGINT 신호를 보냅니다. 백그라운드 작업은 이 신호의 영향을 받지 않습니다.

'기타' 카테고리의 다른 글

10. Crontab  (0) 2025.08.28
08. 로그  (1) 2025.08.28
05. 파일 복사 / 이동  (0) 2025.08.28
04. 파일 권한 및 파일 관리  (2) 2025.08.28
03. 프로세스 (관리)  (0) 2025.08.28

+ Recent posts