Computer >> 컴퓨터 >  >> 스마트폰 >> Linux

리눅스 nohup 명령어로 백그라운드 프로세스 실행하는 방법

SSH로 원격 서버에 접속해 작업하다 보면, 연결을 종료하거나 네트워크가 끊긴 후에도 계속 실행되어야 하는 작업을 처리해야 할 때가 많습니다. 예를 들어 로그 파일을 분석하는 셸 스크립트나 대용량 MySQL 데이터베이스 복원처럼 시간이 오래 걸리는 작업이 대표적입니다. 이럴 때 리눅스의 nohup 명령어를 활용하면 SSH 세션이 종료되어도 프로세스를 안전하게 계속 실행할 수 있습니다.

nohup이란 무엇인가?

"nohup"은 "no hangup"의 약자로, "접속 종료(hang up) 신호를 무시하라"는 의미를 담고 있습니다. 사용자가 로그아웃하면 시스템은 실행 중인 프로세스에 hangup 신호를 보내 종료시키는데, nohup으로 실행한 프로세스는 이 신호를 무시합니다. 따라서 서버에 접속해 프로세스를 시작한 뒤 로그아웃해도 작업은 멈추지 않고 계속 진행되며, 다시 로그인했을 때 프로세스가 아직 실행 중이라면 그대로 확인할 수 있습니다.

nohup 기본 문법

# nohup [명령어] &

[명령어] 자리에 실행할 셸 스크립트 이름이나 명령을 입력합니다. 명령 끝에 붙이는 "&"는 해당 작업을 백그라운드 프로세스로 실행하겠다는 의미입니다. 두 요소를 함께 사용하면 터미널을 점유하지 않으면서, 세션이 끊겨도 살아있는 프로세스를 만들 수 있습니다.

실전 예시: 대용량 MySQL 데이터베이스 백업

원격 서버에서 대용량 MySQL 데이터베이스를 백업하는 상황을 예로 들어보겠습니다. 먼저 SSH로 원격 서버에 접속합니다.

# ssh calvin@sevenacross.com

그다음 mysqldump 명령 앞에 "nohup"을 붙이고 뒤에 "&"를 추가해 백업 작업을 백그라운드에서 실행합니다.

# nohup mysqldump -ucalvin -phobbes largedatabase > largedatabase.db &
[1] 3999
# nohup: appending output to `nohup.out'

출력 결과 해석하기

명령 실행 후 두 줄의 출력이 표시됩니다. 첫 번째 줄의 "3999"는 방금 생성된 프로세스의 PID(프로세스 ID)입니다. 두 번째 줄의 "nohup: appending output to `nohup.out'" 메시지는, 원래 터미널로 출력되어야 할 내용이 명령을 실행한 디렉터리의 "nohup.out" 파일에 기록된다는 의미입니다.

프로세스 실행 여부 확인

프로세스 ID를 이용해 실행 중인 전체 프로세스 목록을 검색하면 해당 작업이 아직 살아있는지 확인할 수 있습니다.

# ps -ef | grep 3999
calvin 3999 29848 0 18:42 ? 00:00:00 /usr/bin/mysqldump
calvin 6575 31852 0 18:44 pts/2 00:00:00 grep 3999

작업 완료 확인과 로그 검토

백그라운드 작업이 정상적으로 끝나면 명령줄에 다음과 같은 메시지가 표시됩니다.

[1]+ Done nohup mysqldump -ucalvin -phobbes largedatabase > largedatabase.db

작업이 완료된 후에는 "nohup.out" 파일을 열어 실행 중 발생한 오류나 기타 메시지를 확인하는 것이 좋습니다. 파일이 비어 있다면 프로세스 실행 중 아무런 경고나 오류가 출력되지 않았다는 뜻이므로 정상적으로 완료된 것으로 볼 수 있습니다.

마무리

nohup은 원격 서버를 관리하는 개발자와 시스템 관리자에게 필수적인 도구입니다. SSH 연결이 언제 끊길지 알 수 없는 환경에서도 장시간 작업을 안심하고 맡길 수 있기 때문입니다. 백그라운드 프로세스 실행에 익숙해졌다면, screen이나 tmux 같은 터미널 멀티플렉서도 함께 활용해 보면 더욱 편리하게 서버 작업을 관리할 수 있습니다.