티스토리 뷰
개요
- 리눅스 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
- 2070 -bash
- 2068 sshd: root@pts/0
- 1620 /usr/sbin/sshd
이러한 구조는 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
... (생략)
- → 정상적으로 동작하고 있다.
- 출처 : 제타위키-리눅스 스크립트 백그라운드 실행
쉘 스크립트를 통해 서버가 남기는 로그를 지속적으로 지워주기 위해서 스크립트를 작성해두었는데
실수로 터미널을 종료하거나 세션이 만료되어 스크립트 수행이 모르는 사이에 중지되어 당황한적이 있었는데
찾다보니 이렇게 간단한 방법이 있었음을 알게되었다.
잊지말아야지
'프로그래밍 > OS' 카테고리의 다른 글
멀티 프로세싱 케케묵은 문제들 - 병렬 처리 관련 문제 (0) | 2016.11.28 |
---|---|
리눅스 Jstat으로 JVM heap memory 모니터링하기 (0) | 2016.09.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 기한
- commit
- 페북
- json
- Jackson
- 대학의 정석
- Template Method
- gcutil
- variable
- Eclipse
- 붙여넣기
- 클립보드
- directory
- migrate
- shapeshifter
- jstat
- equals
- 멀티프로세싱
- 팀플
- 페이스북
- 디렉토리
- github
- "
- 당신 없는 회사에 가고 싶다
- java
- serialization
- 백그라운드
- 템플릿 메소드
- 생산자
- NullPointerException
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함