Linux에서 nohup 명령을 사용하는 방법

게시 됨: 2022-06-25
bash 프롬프트를 표시하는 Linux 노트북
Fatmawati achmad zaenuri/Shutterstock.com

Linux nohup 명령을 사용하면 중요한 프로세스를 시작한 터미널 창이 닫힌 경우에도 계속 실행할 수 있습니다. 오늘날의 Linux에서 이 유서 깊은 명령을 사용하는 방법을 보여줍니다.

HUP과 SIGHUP

Linux의 조상인 Unix는 PC가 발명되기 전에 만들어졌습니다. 컴퓨터는 크고 값비싼 장비였습니다. 사람들은 같은 건물 내에서 로컬로 또는 느린 모뎀 연결을 통해 원격으로 직렬 회선을 통해 그들과 상호 작용했습니다. 원래 그들은 점차적으로 멍청한 단말기로 대체된 텔레프린터에 지침을 입력했습니다.

처리 능력이 입력 중인 터미널이 아니라 연결된 컴퓨터에 있기 때문에 벙어리라고 불렸습니다. 프로그램은 책상 위의 장치가 아니라 컴퓨터에서 실행되고 있었습니다.

터미널과 컴퓨터 사이의 연결이 끊어지는 일이 발생하면 컴퓨터가 회선 끊김을 감지하고 실행 중인 프로그램에 HUP 또는 전화 끊기 신호를 보냅니다. 프로그램은 신호를 받았을 때 실행을 멈췄습니다.

Linux에서 데스크탑 애플리케이션 또는 백그라운드 프로세스를 종료하는 방법
관련 Linux에서 데스크톱 응용 프로그램 또는 백그라운드 프로세스를 종료하는 방법

그 기능은 오늘날에도 Linux에 존재합니다. PC에서 터미널 창은 물리적 터미널의 에뮬레이션입니다. 해당 터미널 창에서 시작된 프로세스가 실행 중이고 해당 창을 닫으면 SIGHUP 신호가 프로그램에 전송되어 HUP 에 대해 알리고 종료해야 함을 알립니다.

캐스케이드 효과가 발생합니다. 프로세스가 자식 프로세스를 시작했다면 SIGHUP도 자식 프로세스로 전달되어 종료해야 함을 알 수 있습니다.

nohup 명령은 자식 프로세스를 시작하지만 SIGHUP 신호 전달을 거부합니다. 문제처럼 들릴 수 있지만 실제로는 유용한 기능입니다.

nohup 명령

실행된 터미널 창이 닫힌 경우에도 프로세스를 계속하려면 프로그램이 수신하지 않도록 SIGHUP 을 가로채는 방법이 필요합니다. (사실, 터미널 창은 프로세스를 시작하지 않고 터미널 창 내부의 셸 세션에 의해 시작됩니다.) 해당 문제에 대한 간단하고 우아한 해결책은 셸 세션과 프로그램 사이에 다른 프로세스를 배치하고 중간 계층 프로그램은 SIGHUP 신호를 전달하지 않습니다.

그것이 nohup 이 하는 일입니다. 쉘의 자식 프로세스가 아니라 nohup 의 자식 프로세스가 되도록 프로그램을 시작합니다. 셸의 자식 프로세스가 아니기 때문에 셸에서 직접 SIGHUP 을 받지 않습니다. 그리고 nohup 이 자식에게 SIGHUP 을 전달하지 않으면 프로그램은 SIGHUP 을 전혀 받지 않습니다.

이는 예를 들어 실행을 완료해야 하는 장기 실행 프로세스가 있는 경우에 유용합니다. 실수로 터미널 창과 해당 셸을 닫으면 프로세스도 종료됩니다. nohup 을 사용하여 프로세스를 시작하면 nohup 신호에서 프로세스가 분리됩니다. SSH를 통해 컴퓨터에서 원격으로 작업하고 원격 연결이 실패할 경우 민감한 프로세스가 종료되는 것을 원하지 않는 경우 원격 컴퓨터에서 nohup 으로 프로세스를 시작합니다.

nohup 사용

우리는 아무 것도 하지 않는 프로그램을 만들었지만 종료될 때까지 계속 실행됩니다. 3초마다 터미널 창에 시간을 출력합니다. "긴 프로세스"를 위해 long long-proc 이라고 합니다.

 ./long-proc 

터미널 창을 실행하는 long-proc 프로그램

이것이 유용한 작업을 하는 프로그램이고 터미널 창과 셸이 닫힌 경우에도 계속 실행되기를 원한다면 nohup 으로 시작합니다.

 nohup ./long-proc 

nohup에서 long-proc 프로그램 시작

프로세스는 stdinstdout 에서 분리되어 입력을 수신하거나 터미널 창에 쓸 수 없습니다. 또한 여전히 실행 중이므로 명령 프롬프트로 돌아가지 않습니다. nohup 이 하는 일은 터미널이 닫히지 않도록 프로세스를 만드는 것뿐입니다. 프로세스를 백그라운드 작업으로 전환하지 않습니다.

이제 프로세스를 종료하기 위해 재부팅해야 합니까? 아니요. 백그라운드 프로세스로 시작하지 않은 nohup 프로세스를 중지하려면 Ctrl+C 키 조합을 누르십시오.

Ctrl+C로 long-proc 프로세스 중지

프로그램의 출력은 "nohup.out"이라는 파일에 캡처되었습니다. 더 적은 비용으로 검토할 수 있습니다.

 덜 nohup.out 

nohup.out 파일 열기

일반적으로 터미널 창으로 보내지는 모든 것이 파일에 캡처됩니다. nohup 의 후속 실행은 기존 "nohup.out" 파일에 추가됩니다.

nohup.out 파일에 작성된 long-proc의 출력은 less에 표시됩니다.

프로세스를 실행하는 더 유용한 방법은 터미널 창이 닫히는 것을 견디도록 nohup 으로 실행하고 동시에 백그라운드 작업으로 만드는 것입니다. 이를 위해 명령줄 끝에 앰퍼샌드 " & "를 추가합니다.

 nohup ./long-proc & 

nohup으로 long-proc 프로그램을 시작하고 백그라운드 작업으로 만들기

명령 프롬프트로 돌아가려면 "Enter"를 한 번 더 눌러야 합니다. 우리는 프로세스의 작업 번호가 1(대괄호 " [] " 안의 숫자)이고 프로세스 ID가 13115라고 들었습니다.

이들 중 하나를 사용하여 프로세스를 종료할 수 있습니다. 프로그램이 터미널 창이나 셸과 연결되어 있지 않기 때문에 "Ctrl+C"는 이제 작동하지 않습니다.

작업 번호가 무엇인지 잊어버린 경우 jobs 명령을 사용하여 해당 터미널 창에서 시작된 백그라운드 작업을 나열할 수 있습니다.

 직업 

터미널 창에서 시작된 백그라운드 작업 나열

작업을 종료하기 위해 다음과 같이 백분율 기호 " % "가 앞에 오는 kill 명령과 작업 번호를 사용할 수 있습니다.

 % 1 죽이기

터미널 창을 닫은 경우 프로세스 ID를 찾아 kill 명령과 함께 사용해야 합니다. pgrep 명령은 제공한 검색 단서와 일치하는 프로세스의 프로세스 ID를 찾습니다. 프로세스 이름을 검색합니다.

 pgrep long-proc 

이름으로 프로세스의 프로세스 ID 찾기

이제 프로세스 ID를 사용하여 프로세스를 종료할 수 있습니다.

 13115 죽이기 

kill 명령 및 프로세스 ID를 사용하여 프로세스 종료

다음에 "Enter"를 누르면 프로세스가 종료되었다는 알림이 표시됩니다.

이제 프로세스를 종료 하지 않는 항목을 살펴보겠습니다. 다시 실행한 다음 터미널 창을 닫습니다.

 nohup ./long-proc 

실행 중인 프로세스로 터미널 창 닫기

새 터미널 창을 열고 pgrep 으로 프로세스를 검색하면 여전히 실행 중임을 알 수 있습니다. 프로세스를 시작한 터미널 창을 닫아도 아무런 효과가 없습니다.

 pgrep long-proc 

pgrep을 사용하여 이름으로 프로세스 검색

nohup 에 여러 명령을 전달할 수 있지만 일반적으로 개별적으로 실행하는 것이 좋습니다. 백그라운드 작업으로 쉽게 조작할 수 있습니다. 명령은 동시에 실행되지 않고 차례로 실행됩니다. 실행은 동시가 아니라 순차적입니다. 동시에 실행하려면 별도로 실행해야 합니다.

한 번에 여러 프로세스를 시작하려면 nohup 을 사용하여 Bash 셸을 시작하고 -c (명령) 옵션을 명령 문자열과 함께 사용합니다. 작은따옴표 " ' "를 사용하여 명령 목록을 래핑하고 이중 앰퍼샌드 " && "를 사용하여 명령을 구분합니다.

 nohup bash -c 'ls /bin && ls /sbin' 

nohup으로 두 프로세스 시작

less 를 사용하여 "nohup.out" 파일을 살펴보면 첫 번째 프로세스의 출력을 보고 두 번째 프로세스의 출력을 볼 수 있습니다.

 덜 nohup.out 

nohup.out 파일 열기

두 명령의 출력은 "nohup.out" 파일에 캡처되었습니다. 서로 얽혀 있지 않고 두 번째 프로세스의 출력은 첫 번째 프로세스가 종료된 후에만 시작됩니다.

less에 있는 nohup.out 파일의 내용

"nohup.out" 대신 자신의 파일을 사용하려면 원하는 파일로 명령을 리디렉션할 수 있습니다.

 nohup bash -c 'ls /bin && ls /sbin' > myfile.txt 

프로세스의 출력을 사용자 제공 파일로 리디렉션

메시지는 더 이상 "nohupo.out에 출력 추가"라고 말하지 않고 "stderr을 stdout으로 리디렉션"이라고 말하고 stdout을 "myfile.txt" 파일로 리디렉션하고 있습니다.

더 적은 비용으로 "myfile.txt" 파일 내부를 볼 수 있습니다.

 적은 myfile.txt 

이전과 마찬가지로 여기에는 두 명령의 출력이 포함됩니다.


유틸리티의 역사가 때때로 그것이 현대와 관련이 없는 것처럼 보이게 만드는 방법이 재미있습니다. nohup 명령은 그 중 하나입니다. 직렬 회선의 연결 끊김에 대처하기 위해 만들어진 것은 오늘날의 엄청나게 강력한 시스템을 사용하는 Linux 사용자에게 여전히 유용합니다.

관련: 알아야 할 37가지 중요한 Linux 명령