배쉬 노홉 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
를 리디렉션합니다.