티스토리 뷰

개요

리눅스 Background 실행
스크립트 백그라운드 실행
SSH 접속 끊겨도 스크립트 계속 실행하기
  • 일반적으로 SSH 접속이 중단되면 그 세션에서 Foreground로 실행중인 스크립트도 중단된다.
  • 중단되지 않게 하려면 백그라운드로 실행하면 된다.

테스트용 bash 코드

/root/script/test.sh 파일의 내용

#!/bin/bash
rm -f /root/test.log
for i in {1..100}
do
  NOW=`date +%Y-%m-%d\ %H:%M:%S`
  echo "[$NOW] i = $i" >> /root/test.log
  sleep 2
done
echo done...
→ 2초마다 /root/test.log에 기록을 남기는 스크립트

Foreground 실행 (중단됨)

[root@zetawiki ~]# sh test.sh
→ 가만히 놔두면 대략 200초(2초 X 100회)간 실행될 것이다.
→ 그냥 기다리지 말고...

SSH 클라이언트에서 강제로 연결을 끊은 후 다시 접속해보자.

Last login: Tue Jun 25 17:08:14 2013 from 135.79.246.80
[root@zetawiki ~]# ps -ef | grep -v grep | grep test.sh
→ 프로세스가 중단되어서 없다.
[root@zetawiki ~]# cat test.log
[2013-06-25 17:11:11] i = 1
[2013-06-25 17:11:13] i = 2
[2013-06-25 17:11:15] i = 3
→ 실행이 되다 말았다.

백그라운드 실행 (계속됨)

백그라운드로 실행하면 SSH 접속이 끊겨도 계속 수행된다.

[root@zetawiki ~]# sh test.sh &
[1] 2215
→ 백그라운드 프로세스 2215번으로 등록되었다.

2215번 프로세스의 계보를 살펴보자.

[root@zetawiki ~]# ps -ef | grep -v grep | grep test.sh
root      2215  2070  0 17:14 pts/0    00:00:00 sh test.sh
[root@zetawiki ~]# ps -ef | grep -v grep | grep 2070
root      2070  2068  0 17:11 pts/0    00:00:00 -bash
root      2215  2070  0 17:14 pts/0    00:00:00 sh test.sh
root      2272  2070  0 17:15 pts/0    00:00:00 ps -ef
[root@zetawiki ~]# ps -ef | grep -v grep | grep 2068
root      2068  1620  0 17:11 ?        00:00:00 sshd: root@pts/0 
root      2070  2068  0 17:11 pts/0    00:00:00 -bash
[root@zetawiki ~]# ps -ef | grep -v grep | grep 1620
root      1620     1  0 Jun15 ?        00:00:01 /usr/sbin/sshd
root      2068  1620  0 17:11 ?        00:00:00 sshd: root@pts/0
[root@zetawiki ~]# ps -ef | grep -v grep | grep init
root         1     0  0 Jun15 ?        00:00:00 init [3]   
[root@zetawiki ~]# exit

정리하면 test.sh은 다음과 같은 구조로 실행되고 있다.

  • 1 init [3]
    • 1620 /usr/sbin/sshd
      • 2068 sshd: root@pts/0
        • 2070 -bash
          • 2215 sh test.sh

이러한 구조는 Foreground 실행시에도 동일하다. Foreground 실행시에는 SSH 접속을 끊으면 sshd: root@pts/0 프로세스가 종료되면서 하위 프로세스들도 종료된다.

백그라운드 실행시에는 어떻게 되는지 다시 접속하여 확인해보자.

Last login: Tue Jun 25 17:11:34 2013 from 135.79.246.80
[root@zetawiki ~]# ps -ef | grep -v grep | grep test.sh
root      2215     1  0 17:14 ?        00:00:00 sh test.sh
→ PID는 2215번 그대로이지만, 부모프로세스가 init(1)으로 바뀌어서 계속 실행되고 있다.
[root@zetawiki ~]# tail -f test.log
[2013-06-25 17:16:50] i = 59
[2013-06-25 17:16:52] i = 60
[2013-06-25 17:16:54] i = 61
[2013-06-25 17:16:56] i = 62
... (생략)
→ 정상적으로 동작하고 있다.

출처 : 제타위키-리눅스 스크립트 백그라운드 실행



쉘 스크립트를 통해 서버가 남기는 로그를 지속적으로 지워주기 위해서 스크립트를 작성해두었는데


실수로 터미널을 종료하거나 세션이 만료되어 스크립트 수행이 모르는 사이에 중지되어 당황한적이 있었는데 


찾다보니 이렇게 간단한 방법이 있었음을 알게되었다.


잊지말아야지




공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함