배쉬 노홉 vs 앰퍼샌드
이 짧은 기사에서는 Bash를 통해 백그라운드에서 Linux 프로세스를 실행하기 위한 nohup 명령과 & 제어 연산자에 대해 설명합니다. 또한 nohup과 &의 주요 차이점을 자세히 살펴보겠습니다.
백그라운드에서 Linux 프로세스 실행
Linux는 백그라운드에서 프로세스 또는 명령을 실행하는 두 가지 방법을 제공합니다.
- 앰퍼샌드(
&) 제어 연산자만 사용하십시오. &와 함께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
여기서 PID는 sleep 명령에 할당된 프로세스 ID를 나타냅니다.
제어 연산자 &와 nohup 명령의 차이점
다음은 & 및 nohup을 사용하여 백그라운드에서 명령 또는 프로세스를 실행하는 것 사이의 몇 가지 차이점입니다.
-
nohup은 끊기 신호(SIGHUP)를 포착할 수 있지만&는 포착할 수 없습니다.SIGHUP신호는 프로세스가 시작된 터미널이 닫힐 때 프로세스에 신호를 보내는 데 사용됩니다. -
일반적으로 프로세스 또는 명령은 이 명령 또는 프로세스가 시작되는 쉘이 존재할 때까지
&를 사용하여 백그라운드에서 실행됩니다. 셸이 종료되면&를 사용하여 백그라운드에서 실행 중인 모든 관련 명령 또는 프로세스도 종료됩니다.터미널이 종료되면
SIGHUP (kill SIGHUP <pid>)을 사용하는 끊기 신호가 해당 터미널의 모든 하위 명령 또는 자식 프로세스를 종료합니다. 그러나 이것은nohup을 사용하여 방지할 수 있습니다.nohup명령은SIGHUP신호를 포착하고 실제 명령에 도달하지 못하게 합니다. 따라서 Bash 터미널이 종료될 때 명령이 종료되지 않도록 제한합니다. -
&와nohup의 또 다른 차이점은stdout/stderr의 리디렉션에 관한 것입니다.&연산자는stdout/stderr를 자동으로 리디렉션하지 않고 명령의 출력을 터미널에 직접 표시합니다. 그러나nohup은$HOME에 있는nohup.out파일에서stdout/stderr를 리디렉션합니다.