[Linux] nohup을 이용한 백그라운드 작업

2021. 5. 4. 18:28 OS/Linux

들어가며:

  우리가 ssh를 접속해서 무언가를 작업을 할때 세션이 타임아웃되서 실행중이던 작업이 종료될때가 있다. 그럼 정말 너무 화가 치밀어 오르며, 다시 접속을 한 뒤에 그전에 작업을 다시 실행한다. 그래서 ssh connection이 끊어져도 작업을 할 수 있는 방법을 찾아보니 nohup을 이용해서 하는 방법이 있다. nohup을 이용하면 결과적으로는 세션이 타임아웃이 되어도, 내가 실행한 작업은 백그라운드에서 계속 실행한다. nohup을 사용하는 방법은 아래와 같다.

 

nohub 사용하기:

$ nohup command 1>/dev/null 2>&1 &

  위에서 사용하는 명령어에 대해서 이해를 하기 위해서는 아래 내용을 읽어보시기 바랍니다. 

 

I/O Redirection:

  bash와 다른 shell에서는 I/O redirection을 제공합니다. I/O는 3가지 표준스트림이 존재합니다. 쉽게 말하면 화면에 키보드로 입력하는 스트림, 스크린에 출력을 해주는 스트림, 에러를 출력하는 스트림이 존재합니다. 아래 내용은 키보드, 스크린에 입력하고 출력하는 스트림을 redirection하는 방법에 대해서 설명합니다. 

 

I/O streams numbers :

- 표준입력(stdin): 0
- 표준출력(stdout): 1
- 표준에러(stderr): 2

 

1>/dev/null 이란?:

  아래 명령어를 쉘에서 실행을 하면 ls -al의 결과가 result.log에 저장이 됩니다. 

$ ls -al > result.log
$ ls -al 1>result.log

  그렇다면 ls -al의 결과를 화면에 출력하기 싫으면 어떻게 할까요? 간단하게 화면에 출력되는 표준출력을 result.log에 저장하면 됩니다. 파일로도 남기기 싫다면? 그냥 바로 쓰레기통(/dev/null)에 넣어버리면 됩니다. 결과적으로 아래와 같이 입력하면 어떤 값도 화면에 출력되지 않습니다.

$ ls -al > /dev/null
$ ls -al 1>/dev/null

 

2>&1 이란? (stderr redirect to stdout):

   아래와 같이 입력은 2번 표준에러 파일디스크립터를 1번 파일디스크립터로 redirection 라는 말입니다. 풀어 말하면 1번 표준출력을 /dev/null로 redirection을 했기 때문에, 2번 표준에러도 1번이 redirection하는 /dev/null로 redirection 해라 라는 말입니다. (2—> 1 —> /dev/null)

$ ls -al 2>&1

 

 & 이란?:

  &는 실행 작업을 백그라운드에서 실행하는 역할을 합니다. 결과적으로는

$ nohub command 1>/dev/null 2>&1

  위 실행을 &(백그라운드)로 보낸다. 입니다. 결과적으로는 로그아웃/세션 타임아웃이 되어도 실행된 커맨드의 화면출력 결과를 /dev/null로 버리고, 에러메시지도 화면에 출력하지 않습니다. 

 

출처 : ourcstory.tistory.com/197?category=630687