배쉬 노홉 vs 앰퍼샌드

Dr. Muhammad Abdullah 2023년6월20일
  1. 백그라운드에서 Linux 프로세스 실행
  2. 앰퍼샌드(&) 제어 연산자
  3. nohup 명령
  4. 제어 연산자 &nohup 명령의 차이점
배쉬 노홉 vs 앰퍼샌드

이 짧은 기사에서는 Bash를 통해 백그라운드에서 Linux 프로세스를 실행하기 위한 nohup 명령과 & 제어 연산자에 대해 설명합니다. 또한 nohup&의 주요 차이점을 자세히 살펴보겠습니다.

백그라운드에서 Linux 프로세스 실행

Linux는 백그라운드에서 프로세스 또는 명령을 실행하는 두 가지 방법을 제공합니다.

  1. 앰퍼샌드(&) 제어 연산자만 사용하십시오.
  2. &와 함께 nohup 명령을 사용합니다.

앰퍼샌드(&) 제어 연산자

& 제어 연산자를 사용하여 백그라운드에서 모든 명령을 비동기식으로 실행할 수 있습니다.

다음 명령을 고려하십시오.

sleep 10

sleep 명령은 특정 시간의 지연을 추가합니다. sleep 10 명령을 실행하면 Bash 터미널이 10초 동안 일시 중단되며 터미널에서 다른 명령을 실행할 수 없습니다.

이제 다음 명령을 고려하십시오.

sleep 10 &

위의 명령은 프로세스 ID(PID)를 표시하고 sleep 10은 백그라운드에서 비동기적으로 실행됩니다. 실행 제어는 sleep이 끝날 때까지 기다리지 않고 명령 터미널로 돌아갑니다.

이제 백그라운드 sleep 명령과 동시에 동일한 터미널에서 다른 명령을 실행할 수 있습니다.

다음 명령을 사용하여 백그라운드 프로세스를 포그라운드로 이동할 수 있습니다.

fg

nohup 명령

nohup 명령은 다른 명령이나 프로세스를 실행합니다. 관련 프로세스가 SIGHUP 신호를 받는 것을 방지하는 “no hang-up"을 나타냅니다.

터미널이 닫힌 후에도 명령을 실행하려면 nohup CommandName을 사용할 수 있습니다.

그러나 실행 제어가 터미널로 즉시 반환된 상태에서 백그라운드에서 명령을 실행하려면 다음 명령을 사용해야 합니다.

nohup sleep 10 &

위의 명령은 백그라운드에서 sleep 10 명령을 실행하고 동일한 터미널에서 다른 명령을 실행할 수 있도록 즉시 제어를 반환합니다.

다음과 같이 pgrep 명령을 사용하여 백그라운드에서 실행 중인 명령을 확인할 수 있습니다.

pgrep -a [Command]

pgrep 명령은 Command를 검색하고 실행 명령 세부 정보와 함께 프로세스 ID(PID)를 표시합니다.

예를 들어 pgrep -a sleep은 관련 백그라운드 프로세스를 다음과 같이 표시합니다.

PID sleep 10

여기서 PIDsleep 명령에 할당된 프로세스 ID를 나타냅니다.

제어 연산자 &nohup 명령의 차이점

다음은 &nohup을 사용하여 백그라운드에서 명령 또는 프로세스를 실행하는 것 사이의 몇 가지 차이점입니다.

  1. nohup은 끊기 신호(SIGHUP)를 포착할 수 있지만 &는 포착할 수 없습니다. SIGHUP 신호는 프로세스가 시작된 터미널이 닫힐 때 프로세스에 신호를 보내는 데 사용됩니다.

  2. 일반적으로 프로세스 또는 명령은 이 명령 또는 프로세스가 시작되는 쉘이 존재할 때까지 &를 사용하여 백그라운드에서 실행됩니다. 셸이 종료되면 &를 사용하여 백그라운드에서 실행 중인 모든 관련 명령 또는 프로세스도 종료됩니다.

    터미널이 종료되면 SIGHUP (kill SIGHUP <pid>)을 사용하는 끊기 신호가 해당 터미널의 모든 하위 명령 또는 자식 프로세스를 종료합니다. 그러나 이것은 nohup을 사용하여 방지할 수 있습니다.

    nohup 명령은 SIGHUP 신호를 포착하고 실제 명령에 도달하지 못하게 합니다. 따라서 Bash 터미널이 종료될 때 명령이 종료되지 않도록 제한합니다.

  3. &nohup의 또 다른 차이점은 stdout/stderr의 리디렉션에 관한 것입니다.

    & 연산자는 stdout/stderr를 자동으로 리디렉션하지 않고 명령의 출력을 터미널에 직접 표시합니다. 그러나 nohup$HOME에 있는 nohup.out 파일에서 stdout/stderr를 리디렉션합니다.