본문 바로가기
Linux

[Linux] 터미널 종료와 상관없이 지속 실행되는 process 만들기 : nohup, tmux

by ds31x 2023. 9. 29.

nohup와 tmux 사용하기

ssh로 접속하여 실행시킨 process들의 경우, 해당 접속 터미널 하나에 할당된 하나의 session에 속하게 된다.

  • Process : 현재 실행 중인 프로그램. 각각 실행되는 프로그램을 위한 독립된 메모리 영역(stack, heap, data, code등으로 구성)을 할당받음.
  • Session : user가 접속하여 작업하는 terminal 단위로 process 그룹들을 묶은 일종의 그룹.

문제는 ssh가 종료되거나 갑자기 연결이 끊기는 경우, linux서버는 해당 ssh에 해당하는 session에 속하던 process들을 모두 종료시킨다.

session 종료된 경우,
해당 session의 joblist의
background process들도 종료된다
(zsh의 경우).


터미널 종료이후에도 process수행하기

ssh 등의 원격 접속으로 특정 process를 수행시키고, 해당 접속을 끊은 이후에도 동작을 하게 하려면 다음 방법 중 하나로 수행되어야 함.

  • 해당 procssdaemon으로 만들어 실행시키거나
  • nohup (no hangup)으로 수행(동시에 백그라운드로 수행)시켜
    Terminal이 종료되는 HUP signal을 무시하도록 하여 접속 종료 이후에도 실행되도록 하거나,
  • 백그라운드(&)로 수행을 시킨 후 disown 명령어
    해당 프로세스를 현재 session의 리스트에서 제거하여
    해당 터미널이 종료할 때 같이 종료되지 않도록 수행.
  • tmux (terminal mutiplexer)를 이용하여 해당 process를 수행한다.

일반적으로 ssh로 특정 서버 프로그램 등을 수행할 경우라면 nohup을 사용하는 것이 편하다.

 

만약 ssh 접속이 wifi등과 같이 불안한 경우라면 tmux를 이용하는 것이 가장 쉽다.

 

daemon으로 수행시키는 것이 서버프로그램을 수행시키는 정석이나,

테스트 용이나 단일성의 작업인 경우엔 nohup가 낫다.

disown을 이용하는 경우와 nohup은 비슷한 용도로 사용 가능한데 개인적으로 nohup만 쓰는터라...

 

단순히 background로만 변경하는 경우는
현재 bash에서는 terminal 종료 이후에도 수행되나,
(shopt | grep huponexit 로 확인할 경우 huponexit off 라고 나옴)
zsh에선 처음부터 nohup로 수행시키거나 disown으로 session과 관련된 job 리스트에서 제거해야함.

nohup 사용하기.

nohup [target_process_or_target_sh] &
  • target_process target_shhangup 시그널이 와도 종료되지 않도록 수행함.
  • nohup로 수행될 프로세스나 셀은 permission이 755 이상이어야 함.
  • & 를 끝에 추가하여 background로 수행되도록 하는게 일반적.

위와 같이 수행된 process나 sh파일의 stdout으로의 출력은 nohup.out 파일에 쓰여짐.

다음을 통해 stdoutstderr를 달리 지정한 파일에 쓰여지도록 하는 경우가 많음.

nohup [target_process_or_traget_sh] > test.log 2>&1 &

tmux (terminal multiplex)사용하기.

ssh로 접속하고 tmux를 수행하고 나면,

tmux 가상터미널이 수행되면서 session이 생성되고
해당 가상터미널 session에서 수행된 process들은 ssh 접속이 끝나더라도 종료되지 않음.

 

이후 다시 접속하고나서 tmux attach -t [대상 session] 를 수행하면

끊기기 전 sessionprocess들이 죽지않고 유지되고 있기 때문에
그대로 이전 상태에서 이어서 작업이 가능함.

  • tmux ls :
    • 현재 수행되고 있는 session들의 리스트를 보여줌
    • session number 와 session name 이 보여짐.
  • tmux new -t [생성할session의 name] :
    • tmux 로만 수행하면 session number로 session이 생성되지만,
    • 이 방식으로 수행하면 name을 지정하여 생성하게 된다.
  • tmux kill-session -t [종료할 session의 name or 번호] :
    • 특정 session을 강제 종료시킴.
  • tmux attach -t [다시 연결할 session의 name or 번호] :
    • 해당 session에 다시 접속 (attach)
  • ctrl+b+d :
    • tmuxsession에서 수행하면
    • 해당 session에서 d(dettach)된다.(tmux attach의 반대)

접속이 불안한 환경에서 작업을 한다면

ssh로 접속하고 나서 tmux를 수행하여 작업을 하는게 좋고,
이후 끊기다면 tmux attach를 수행하여 이어서 작업을 하면 된다.


읽어보면 좋은 자료들

https://velog.io/@ur-luella/tmux-사용법

 

[Linux] tmux 사용법

 

velog.io

https://m31phy.tistory.com/226

 

[Linux] 터미널이 종료 후 프로그램 계속 실행시키기 (&, &&, nohup)

Linux의 터미널에서 실행되고 있는 프로그램들은 터미널이 종료가 되면 같이 종료가 되는 경우가 있다. 이런 경우, 아래와 같은 방법을 이용하면, 터미널을 종료시키더라도 프로세스가 계속 실행

m31phy.tistory.com

https://www.devkuma.com/docs/linux/nohup/

 

Linux 명령어 | 프로세스 관리 | nohup 세션이 끊겨도 계속 실행

nohup 명령어 nohup 명령어는 로그아웃 등과 같이 터미널과의 세션 연결이 끊기더라도 프로세스가 계속 동작되도록 해준다. 일반적으로 터미널과의 세션 연결이 끊기게 되면 리눅스에서는 해당 세

www.devkuma.com

 

728x90