사실 우리는 Terminal로 해서 많이 실행하곤 한다.
하지만 Terminal을 나와서도 서버 컴퓨터가 동작하게끔 해야 할 때가 있다.
그게 바로 Production 상황일 때다.
개발?, QA? 서비스 대상이 없기 때문에 내가 필요할 때만 터미널 들어가서 프로세스가 실행하면 된다.
하지만 Production 상황일 때는.. 어떻게 할까???
당연히.. 나는 내 컴퓨터로 세션을 유지하면서 프로세스가 동작하기를 원하지는 않는다.
그냥 내가 무엇인가 명령을 할 때까지 계속 VM에서 실행되었으면 한다.
VM이든.. 서버든..근데 나는.. 아직도 몰랐다.
내가 이전에 express로 구현할 때.. ㅋㅋㅋ나는 세션을 유지해서 실행했다..ㅠㅠㅠ
아직도 무지하지만 조금 더 발전하고자 알아보았다.
리눅스에서는 nohup 이라는 명령어가 있다.
nohup 은 프로세스가 hangup signal을 무시하는 것이다.
Terminal에서 나와도, 다시 말해서 세션이 끊어지는 것을 무시한다.
터미널이 꺼져도 여전히 작동한다는 뜻이다.
** &을 사용해서 실행한다.
여기서 &이 의미하는 바는 프로세스를 백그라운드에서 동작시키겠다는 의미다.
nohup {process} & #실행 방법
일반적으로 백그라운드에서 실행되더라도 nohup이 되지 않은 프로세스는 터미널 연결이 끊김과 동시에 꺼진다.
이 명령어는 아래와 같은 역할을 한다.
이게 왜 그러냐면.. 세션에서 quit할 때 children 들에게 모두 Signal을 보내서 종료시키는데
이 프로세스는 그것을 무시한다는 것이다.
***쉘 스크립트 짤 때 실행하자마자 exit이 나온다면 그것은.. 에러가 난 것이다.
그 외에도 disown 방법이 있다.
disown을 특정한 작업 자체를 children에서 제외시켜서 signal을 받지 못하게 하는 방법이다.
=> disown은 실제로 own(소유권)을 해제하는 것이다.
즉, 세션이 가지고 있던 job의 소유권을 뺏는 것이다.
=> 결국 signal을 받지 못하므로 꺼지지 않는다.
하지만 중요한 것은 disown은 terminal과 연결은 그대로 유지한다.
그래서 터미널이 destroy되면 프로그램이 꺼질 것이다.
=> 뒤에서 disown -h 를 알면 된다.
nohup과 disown의 차이는 뭔데??
nohup will detach the program from the current shell and send its output to " $nohup.out ".
=> 이 말은 표준 출력이 nohup.out 파일에 기록된다는 말이다.
다시 말해서 로그를 찍을 수도 있다는 말과 같다. 하지만 계속 실행되는 만큼 파일의 용량에 신경써주어야 한다.
***nohup.out 파일을 생성하지 않으려면 표준출력과 표준에러를 /dev/null 로 변경해주면 된다.
1>/dev/null 은 표준 출력을 사용하지 않겠다는 의미다.
2>&1 은 표준 에러를 표준 출력과 같게 만드는 명령어다.
If you quit the shell or whatever, the process will continue to run until it completes.
nohup은 프로그램 자체를 Shell과 분리시키는 것이다.
그래서 쉘에서 어떤 작업을 해도 된다.
결국 Shell에서 어떤 작업을 하든 그 프로세스는 진행된다.
** The nohup command is implemented as a Bash built-in, but also as a separate utility on some systems, so be sure to check if its behavior differs from what’s described here.
???? 아니 그러면 언제까지 실행되는거...??
nohup 으로 실행한 프로세스를 종료하려면 먼저 ps 명령어로 PID를 식별한 다음,
kill 명령어를 사용하여 해당 프로세스에 종료 시그널을 보내서 종료해야 한다.
아래처럼 꺼버린다.
ps -ef | grep [process]
# PID 식별 후
kill -15 [PID]
# 종료되지 않으면 강제 종료 (비권장)
kill -9 [PID]
그렇다면 disown을 더 알아보자
if you didn’t expect to be leaving the computer but get called away? Then there’s disown.
**disown is specific to GNU Bash
무슨 말이지...??
While the command is running, use Ctrl-z to stop it and then use bg to put it in the background.
Then you’ll use disown %n where n is the job number (jobspec).
And, of course, you can find the job number using the jobs command.
Run jobs again to verify that the job has been detached — and you can use ps or top to verify that the job is actually still running.
우리가 하려는 작업의 번호가 n이라고 해보자.
지금 running하고 있지만 우선 멈추고(Ctrl + z) [현재 foreground에서 실행 중]
bg를 통해 백그라운드로 보낸다.
그 이후 disown &n을 사용하고
jobs 커맨드로 실제로 detached 되었는지 확인한다.
ps나 top을 통해서 우리가 원하는 job이 실제로 계속 실행되는지 본다.
**하지만 여기선 여전히 터미널에서 사라졌을 뿐 터미널 연결상태는 유지 중이다.
disown은 이렇게 쓴다.
disown (options) jobID1 jobID2
이제 예시를 시작해보자
2가지 작업을 한다고 쳐보자
cat /dev/urandom > /dev/null &
ping unixcop.com > /dev/null &
현재 들고있는 job list들을 보자
2가지를 백그라운드에서 실행했으니 저렇게 2가지가 있다.
jobs -l
만약 현재 job 모두를 disown 하고 싶다면 아래처러 -all 플래그를 넣어도 된다.
disown -a
역시 모두 disown 되었기에 현재 터미널에서는 볼 수 없다.
물론 job id로도 할 수 있다.
지금은 1,2가 있지만
1번만 제외하면??
r 플래그는 현재 running 상태인 job 들을 제외시키는 것이다.
disown -r
또한 아무 플래그나 id가 없다면 마지막 job이 default로 제외된다.
하지만 일단 system terminal에서 exit을 하면 자동으로 job들이 종료가 된다.
그걸 막는 disown을 하기 위해선 하나의 플래그가 더 필요하다.
disown -h (jobID)
이렇게 하면 terminal을 닫는다고 해도 저 job은 계속 running을 하게 된다.
???????무슨 소리지?????
If you haven’t started the job yet, nohup is an easy to use option,
and if you must stop a job in the middle, there’s disown.
라는 말이다.
음.. 다시 말해서
nohup은 아직 시작하지 않은 프로세스에 쓰고
disown은 중간에 프로세스를 멈춰야할 때 쓴다고 말한다.
나도 이말은 뭔지 모르겠다.
물론 다른 방법인 screen 과 tmux가 있지만 위에 것들이 가장 전통적인 방법이라고 한다.
screen이나 tmux는 사실 serverless 개념에 더 가깝다.
필요할 때만 동작한다는 개념이다.
참고링크
https://unixcop.com/how-to-use-disown-command-in-linux/
https://gracefulprograming.tistory.com/128
https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and
https://www.serverwatch.com/guides/detach-processes-with-disown-and-nohup/
https://unix.stackexchange.com/questions/479/keep-processes-running-after-ssh-session-disconnects
'SRE > Linux Basics' 카테고리의 다른 글
cut, 문자열 자르기 (0) | 2022.12.02 |
---|---|
Linux 환경에서 init을 대신한 프로세스, systemd (0) | 2022.11.18 |
리눅스 환경에서의 운영 (0) | 2022.09.01 |
Linux Command, 리눅스 명령어 사전(추가 중) (0) | 2022.09.01 |
배경지식 (0) | 2022.09.01 |