
터미널에서 명령어를 실행했는데 몇 분, 어쩌면 몇 시간씩 걸려서 그동안 터미널을 전혀 사용할 수 없다면 정말 답답하죠. 탭 기능을 활용할 수도 있지만, 이는 다소 번거로운 방법일 뿐 아니라 작업 중에 실시간으로 출력 결과를 확인하고 싶을 때는 최선의 선택이 아닙니다. 이번 글에서는 리눅스에서 Bash 명령어를 백그라운드에서 실행하는 몇 가지 방법을 소개합니다.
명령어 끝에 & 붙이기
명령어를 백그라운드로 보내고 싶다면 명령어 끝에 &를 붙이는 것이 가장 간단한 방법입니다. 이렇게 하면 명령어가 백그라운드에서 실행되는 동안에도 터미널을 계속 사용할 수 있습니다. 다만 한 가지 주의할 점이 있습니다. &를 사용한다고 해서 명령어와의 연결이 완전히 끊기는 것은 아니며, 단지 백그라운드로 보낼 뿐입니다. 즉, 터미널을 사용하는 도중에도 해당 명령어가 STDOUT이나 STDERR로 출력하는 내용은 계속 화면에 나타나 작업에 방해가 될 수 있습니다.

COMMAND &
터미널 세션이 종료되면 명령어도 함께 종료됩니다. 또한 jobs 명령어로 실행 중인 작업 번호를 확인한 후 kill 명령어로 종료할 수도 있습니다. 사용 문법은 다음과 같습니다.

kill %1
&는 작업을 잠시 미뤄두고 싶지만 영구적으로 계속 실행할 필요는 없는 경우에 적합합니다.
& 실행 후 disown으로 분리하기
&만 사용해 명령어를 실행하면 터미널 창이 열려 있는 동안에만 백그라운드에서 계속 실행됩니다. 하지만 터미널 세션이 종료된 후에도 명령어를 계속 실행하고 싶다면 disown 명령어를 사용하면 됩니다.
이 방법을 사용하려면 먼저 명령어 끝에 &를 붙여 실행합니다.
COMMAND &
앞서 언급했듯이 &는 명령어를 백그라운드로 보내지만 사용자와의 연결을 완전히 끊지는 않습니다. 터미널에 jobs를 입력하면 앞서 본 것처럼 백그라운드에서 실행 중인 명령어를 확인할 수 있습니다.
이제 셸에 disown을 입력하기만 하면 됩니다. 역시 jobs 명령어로 결과를 확인할 수 있습니다.

이제 터미널을 닫아도 명령어는 계속 실행됩니다. 여전히 STDOUT이나 STDERR로 출력이 이루어지지만, 터미널을 종료했다가 다시 열면 더 이상 출력 내용이 보이지 않습니다. top이나 ps 명령어로 해당 프로세스를 찾은 후 kill 명령어로 종료할 수 있습니다.

/dev/null과 함께 & 사용하기
명령어 끝에 &를 붙이면 명령어가 백그라운드로 전송되지만, 그 결과 백그라운드 명령어가 터미널을 사용하는 동안 계속 메시지를 출력하게 됩니다. 이를 방지하려면 명령어 출력을 /dev/null로 리디렉션하는 것이 좋습니다.

COMMAND &>/dev/null &
이 방법 역시 터미널이 닫힐 때 명령어가 종료되는 것까지 막아주지는 못합니다. 하지만 앞서 설명한 대로 disown을 함께 사용하면 실행 중인 명령어를 사용자로부터 분리할 수 있습니다. 더 이상 실행하지 않으려면 위에서 언급한 방법들로 종료할 수도 있습니다.
Nohup + & + /dev/null 조합
앞서 소개한 방법들과 달리 nohup을 사용하면 명령어를 백그라운드에서 실행하고 계속 유지할 수 있습니다. 어떻게 가능할까요? nohup은 HUP 시그널(연결 종료 시그널)을 무시하도록 하여 터미널이 꺼져 있어도 명령어가 백그라운드에서 계속 실행될 수 있게 합니다. 여기에 "/dev/null"로의 리디렉션(nohup이 nohup.out 파일을 생성하지 않도록 함)을 결합하면 하나의 명령어로 모든 것을 백그라운드에서 처리할 수 있습니다.
nohup COMMAND &>/dev/null &

오늘날 리눅스의 대부분의 터미널 프로그램은 별도의 노력 없이 백그라운드에서 실행될 수 있는 기능을 내장하고 있습니다. 또한 systemd 같은 현대적인 init 시스템을 통해 부팅 시 또는 필요할 때 프로그램을 서비스처럼 시작할 수 있습니다.
그럼에도 불구하고 일부 리눅스 프로그램은 데몬으로 실행되거나 현대적인 init 시스템과 통합되는 기능이 없습니다. 이는 실제로 불편한 일이지만, 모든 개발자가 새로운 기능을 추가할 기술이나 시간이 있는 것은 아니기 때문에 이해할 수 있는 부분입니다.
다행히 nohup이나 disown 같은 명령어들은 여전히 유용하며, 이런 프로그램들을 백그라운드로 옮기는 격차를 메워줍니다. 완벽하거나 화려하지는 않지만, 필요할 때 충분히 제 역할을 해냅니다.
이 글이 마음에 드셨다면 구글 계정을 GNOME Shell에 연결하는 방법, 윈도우 사용자에게 추천하는 최고의 리눅스 배포판, 알아두면 좋은 LS 명령어 등 저희의 다른 리눅스 관련 콘텐츠도 확인해 보세요.