리눅스 스크립트 백그라운드 실행

1 개요[ | ]

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

2 테스트용 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에 기록을 남기는 스크립트

3 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
→ 실행이 되다 말았다.

4 백그라운드 실행 (계속됨)[ | ]

백그라운드로 실행하면 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
... (생략)
→ 정상적으로 동작하고 있다.

5 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}