Linux Basic

nohup 명령어

별다방체리콕 2024. 2. 1. 16:29

 

 

 

 

 

 

 

 

 

nohup 명령어

로그아웃 등과 같이 터미널과의 세션 연결이 끊기더라도 프로세스가 계속 동작되도록 해줌

 

터미널과의 세션 연결이 끊기게 되면 리눅스에서는 해당 세션에서 실행된 프로세스들에게 HUP (Hang Up, 끊다) 시그널을 전달하여 프로세스들이 종료되도록 함
이 때, "세션이 종료되더라도 계속 실행하게 하고 싶은 프로세스에는 HUP 시그널을 전달하지 않도록 (No Hang Up, 끊지않음) 한다" 는 의미임

 

 

 

 

 

 

 

 

 

nohup 을 사용하는 이유

터미널이나 세션이 종료되어도 해당 프로세스가 종료되지 않고 동작하여 진행한 작업이 완료될 때까지 수행할 수 있도록 도와줌

가끔 오랜 시간이 걸리는 스크립트나 명령어를 필요로할 때 사용하면 좋음

 

사용법은 아주 간단함

프로그램 실행 명령어 앞에 "nohup" 만 붙여주면 됨

실행하면 실행한 경로에 "nohup.out" 이라는 log 파일이 생성됨

이 파일에는 리다이렉션을 사용하지 않은 출력 문자열이 자동으로 저장됨

 

 

 

 

 

 

 

 

 

주의사항

nohup 으로 스크립트 파일 (*.sh)을 실행한다면 실행할 스크립트 파일은 퍼미션이 755 이상 상태여야 함

 

 

 

 

 

 

 

 

 

nohup 기본 사용법

[실행파일] : 실행하고자 하는 프로세스
& : 프로세스를 실행할 때 백그라운드에서 동작하도록 만드는 명령어

 

nohup [실행파일] &
// [실행파일] : 실행하고자 하는 프로세스
// & : 프로세스를 실행할 때 백그라운드에서 동작하도록 만드는 명령어

 

 

 

 

 

 

 

 

 

 

nohup.out 관리

  1. nohup 실행 시 log 파일 생성
    log 파일은 nohup 명령을 실행한 위치에 "nohup.out" 파일로 생성됨
    만약, nohup 명령어로 직접 만든 스크립트 파일을 실행하고자 하는데 명령어 실행 시 "exit" 가 나온다면 스크립트 파일에 에러가 있다는 뜻

  2. nohup 실행 시 log 파일 생성하지 않기
    log 파일을 생성하지 않기 위해 백그라운드 실행과 출력을 "/dev/null" 로 보내는 명령어 사용
    $ nohup [실행파일] 1>/dev/null 2>&1 &​

    • 0 : 표준 입력, 1 : 표준 출력, 2 : 표준 에러
    • 1> /dev/null : 표준 출력(1)의 결과를 /dev/null(버림)으로 전달
    • 2>&1 : 표준 에러(2)를 표준 출력(1)이 전달되는 곳(/dev/null)으로 동일하게 전달
  3. nohup.out 경로 또는 파일명 변경
    ">" 또는 ">>" 와 같은 리다이렉션을 이용해 다른 파일에 출력할 수 있음
    경로 변경 시에는 폴더 생성 후 실행해야 함
    /log/nohup_log.out: No such file or directory 에러가 발생할 수 있음

    1. write 덮어쓰기
      // ">" -write - 덮어쓰기
      $ nohup [실행파일] > [파일] 2>&1 &​

      1번째 실행 :  원하는 경로, 파일명으로 생성됨
      2번째 실행 : 새로 출력됨
    2. append 이어쓰기
      // ">>" - append - 이어쓰기
      $ nohup [실행파일] >> [파일] 2>&1 &​

      1번째 실행 : 원하는 경로, 파일명으로 생성됨
      2번째 실행 : 이어서 출력됨
  4. 표준 출력과 표준 에러 따로 관리하기
    표준출력과 표준 에러를 따로 관리하고 싶을 때는 아래와 같은 형식 사용 가능
    $ nohup [실행파일] 1>[파일1] 2>[파일2] &​

 

 

 

 

 

nohup.out 날짜 별로 rotation 하는 방법

 

1. nohup 실행하기

 

nohup을 실행하여 nohup.out을 생성해줌

nohup [실행파일] &

 

 

 

 

 

2. nohup.sh 만들기

 

설정 파일은 nohup.out 안에 내용이 있을 때만 rotation 하는 방법으로 진행했음
(내용 유무와 상관없이 만들고 싶다면 if 구문만 지우면 됨)

#!/bin/bash

file=/home/ec2-user/nohup.out 				// log 파일
date=`date +%y%m%d-%H%M%S` 				// 저장할 날짜
filePath=/home/ec2-user/nohupHistory/nohup.$date.out 	// 저장할 경로

// # 파일 용량이 0보다 클 때 rotation</span></span>
if [ -s $file ] ; then
	cp "$file" "$filePath"				// 1. nohup.out 복사
	echo "백업완료 cp $file $filePath"		// 2. print
	cat /dev/null > "$file"				// 3. nohup.out 비우기
else
	echo "백업없음 $file"
fi
echo "*******************************************************"

 

1) if [조건] ; then [true일 경우 내용] else [전체 false일 경우 내용] fi

shell script의 if...else 조건문임

사용시 주의할 점 : "[ 조건 ]" 작성시 대괄호 양 사이에 한 칸씩 꼭 공백이 있어야 함

만약 붙이면 에러발생

 

2) -s $file

"-s"는 "$file" 지정한 파일이 존재하고 0 size 파일이 아닌지 체크하는 옵션

파일이 있고, 사이즈가 0보다 클 경우 true

 

 

 

 

3. crontab 등록하기

 

위에서 생성한 nohup.sh를 특정 시간에 또는 특정시간마다 실행시켜주는 설정

crontab 편집기에 cron 표현식을 등록함

// crontab 등록/수정
$ crontab -e

// crontab -e 편집
59 23 * * * sudo sh /home/ec2-user/nohup.sh
  • 59 23 * * * sudo sh /home/ec2-user/nohup.sh

매일 23시 59분에 nuhup.sh를 root 권한으로 실행

 

아래 명령어로 등록된 작업을 확인할 수 있음

$ ps -ef | grep [실행파일]

 

 

 

 

 

 

 

 

 

nohup 프로세스 종료

프로세스를 종료하려면 pid 찾아서 종료해주어야 함

(nohup.out 파일을 삭제한다고 해서 nohup 프로세스가 종료되지 않음)

 

  1. PID 찾기
    $ ps -ef | grep [실행파일]​


  2. 해당 프로세스 종료하기
    $ sudo kill -9 [PID 번호]​

 

'Linux Basic' 카테고리의 다른 글

tail 명령어  (1) 2024.02.19
ftp 명령어  (1) 2024.02.01
sed 명령어  (2) 2024.01.25
set 명령어  (0) 2024.01.24
grep 명령어  (0) 2024.01.23