nohup 사용하기 와 백그라운드에서 작업

By qsp , Created on 14th May 2021

포그라운드와 백그라운드에 작업 하는것에 대해 간략하게 알아보고
프로그램을 계속 실행할 수 있게 하는 nohup 명령어에 대해 알아보자~~

그리고 kill도 같이 실행해보자!!

백그라운드에 작업하려면

리눅스에서 백그라운드로 작업하게 할 때는 명령어 뒤에 & 기호를 사용한다

여기에 nohup이라는 명령어를 사용하면 더 좋다

$nohup

nohup은 명령어 실행하는데 hangup 신호를 무시하게 된다.
hangup signal은 로그 아웃을 할 때 의존성이 있는 프로세스들 멈추게 되는데 그런 것들을 무시하게 된다.

예를 들어서 어떤 프로그램을 실행을 시켰는데, 로그아웃을 해야한다고 한다면..
터미널을 끄기만 해도 로그아웃이 되는데,
터미널이 종료되면 프로세스에게 HUP을(hangup signal) 전달하는데
그러면 프로그램이 종료되거나 멈추게된다.

nohup 을 사용하면 계속 백그라운드에서 작업할 수 있게 되고
터미널을 꺼도 프로그램을 계속 실행되게 된다.

먼저 간단한 테스트 -
스트림릿을 이용한 어플리케이션이 있는데 실행을 시켜보겠다~

$streamlit run app.py

 You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8501

바로 실행이 되면서 웹페이지가 브라우저에 실행이 된다.
하지만 & 기호를 안 썼기 때문에 터미널 상태에서 작동이 되어서
더이상 터미널에 입력을 할 수가 없다..

이를 foreground 에서 실행이 되었다고 한다.
그래서 다른 명령어를 실행한다던가 디렉토리를 바꾸거나 하는 작업을 할 수가 없다.

이때 터미널을 강제로 꺼버렸더니 (로그아웃이 된다)

Unable to connect

Firefox can’t establish a connection to the server at localhost:8501.

웹브라우저에서 연결 자체를 못한다고 나온다


nohup 명령어 실행

이럴 때 nohup 명령어를 실행하는 것이다.

파이썬의 프레임워크인 streamlit을 실행시킬 때
nohup 과 &을 조합하면 아래 코드 처럼 된다

$nohup streamlit run app.py &

이런 메세지가 나오면서 백그라운드에서 작업을 한다고 알려준다.
그리고 nohup.out file로 전달되는 nohup시그널을 무시하겠다 정도이다..

[1] 89398
nohup: ignoring input and appending output to 'nohup.out'

이제 exit 또는 터미널 종료시켜도 nohup 에 의해서 종료가 되지 않고
백그라운드에서 계속 실행되게 된다. 웹브라우저에서는 스트림릿 프로그램이 계속 실행이 되고 있다.

만약 서버에 프로그램을 돌린다고 하면 ssh로 접속을 한 후에 명령어를 실행하고
터미널을 빠져나와야하는데 하루종일 터미널을 켜놓을 수는 없지 않는가?!

이때 사용하는 명령어로 알면 되겠다!


kill 죽여?

이제 프로그램을 끌려면 위에서 나왔던 메세지의 PID로 죽여야한다

그래도 PID를 한번 검색이나 해보자

작동 중지 시키기려면 프로세스들을 검색해야한다 ( | (파이프)와 grep으로 검색하기)

$ps -ef | grep streamlit

결과는

octa    89398    2361  2 17:10 ?        00:00:15 /usr/local/bin/python3.8 /home/octa/.local/bin/streamlit run app.py

유저 이름 뒤에 첫 번째 숫자가 PID 프로세스 아이디 이다~
처음에 nohup 실행 뒤에 나온 PID와 같다!

$kill -9 89398

정상 실행되었으면 아무런 메세지가 뜨지 않는다.
그리고 웹브라우저를 새로고침하면 연결할 수 없다고 나온다.

*-9 옵션은 커널에 의해서 SIGKILL signal을 이용해서 무조건 종료된다
== -KILL 옵션이랑 동일하다, 즉 커널에 의해서 무조건 종료시킨다

참고로...
kill 명령어도 파라미터가 -KILL -SIGSTOP, -SIGINT -SIGHUP 등... 다양하다

-KILL 은 -9와 같은 옵션, 프로그램이 스스로 중단시키는게 아니고 커널에 의해 강제로 종료되버린다

-SIGTERM 은 kill명령어의 기본, 프로그램에 의해 종료된다, 프로그램이 다 실행된 후 종료될 수도 있다고 함

-SIGHUP 은 hangup 이고 프로그램에 사용자가 접속이 끊김을 알리고 종료된다

-SIGINT 은 ctrl+c 프로그램이 종료되는 것, 안꺼질 때도 있다

-SIGSTOP 은 ctrl+z 와 같은, 프로그램을 중단시킨다. 일시정지 같은것;;

다시 nohup으로 실행 한 후 kill 해보았다 (-9 빼고)

$kill 91256

ps를 해보니

octa    91256   10993  0 17:50 pts/2    00:00:00 grep --color=auto streamlit
[1]+  Done                    nohup streamlit run app.py

Done이라고 나오면서 종료가 된 걸로 나온다


다시 또 nohup 실행 후 이번에는 -9

$kill -9 91435

다시 프로세스를 확인해보니

octa    91435   10993  0 17:52 pts/2    00:00:00 grep --color=auto streamlit
[1]+  Killed                  nohup streamlit run app.py

죽었다 ㅋㅋ 표현부터가 다르네 . 확실한 표현같다...커널에 의해 죽임을 당한것이지;; ㅠㅠ


배우기는 -9를 쓰라고 배웠는데 흠 ㅡㅡ;;
꼭 -9를 써서 강제로 종료할 필요가 없는 것 같다. 프로그램에 안좋은 영향을 미칠 수도 있고.. 그리고 기분탓일 수도 있는데.. 컴퓨터가 갑자기 느려졌다;;

그냥 kill 명령어만 써서 종료시키고 (나름 안전하게)
그래도 종료가 안되면 -9 옵션을 시전하자!

댓글

댓글이 없습니다.