1 개요
- 리눅스 Background 실행
- 스크립트 백그라운드 실행
- SSH 접속 끊겨도 스크립트 계속 실행하기
- 일반적으로 SSH 접속이 중단되면 그 세션에서 Foreground로 실행중인 스크립트도 중단된다.
- 중단되지 않게 하려면 백그라운드로 실행하면 된다.
2 테스트용 bash 코드
Bash
Copy
#!/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 실행 (중단됨)
bat
Copy
[root@jmnote ~]# sh test.sh
- → 가만히 놔두면 대략 200초(2초 X 100회)간 실행될 것이다.
- → 그냥 기다리지 말고...
SSH 클라이언트에서 강제로 연결을 끊은 후 다시 접속해보자.
bat
Copy
Last login: Tue Jun 25 17:08:14 2013 from 135.79.246.80
[root@jmnote ~]# ps -ef | grep -v grep | grep test.sh
- → 프로세스가 중단되어서 없다.
bat
Copy
[root@jmnote ~]# 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 접속이 끊겨도 계속 수행된다.
bat
Copy
[root@jmnote ~]# sh test.sh &
[1] 2215
- → 백그라운드 프로세스 2215번으로 등록되었다.
2215번 프로세스의 계보를 살펴보자.
bat
Copy
[root@jmnote ~]# ps -ef | grep -v grep | grep test.sh
root 2215 2070 0 17:14 pts/0 00:00:00 sh test.sh
[root@jmnote ~]# 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@jmnote ~]# 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@jmnote ~]# 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@jmnote ~]# ps -ef | grep -v grep | grep init
root 1 0 0 Jun15 ? 00:00:00 init [3]
[root@jmnote ~]# exit
정리하면 test.sh은 다음과 같은 구조로 실행되고 있다.[1]
- 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
SSH 접속을 끊고 다시 접속해보니...
bat
Copy
Last login: Tue Jun 25 17:11:34 2013 from 135.79.246.80
[root@jmnote ~]# ps -ef | grep -v grep | grep test.sh
root 2215 1 0 17:14 ? 00:00:00 sh test.sh
- → PID는 2215번 그대로인데, 부모프로세스가 init(1)으로 바뀌어서 계속 실행되고 있다.
bat
Copy
[root@jmnote ~]# 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 같이 보기
- ↑ 이러한 구조는 Foreground도 동일하다.
편집자 Jmnote Jmnote bot
로그인하시면 댓글을 쓸 수 있습니다.
- 분류 댓글:
- 리눅스 (19)
CentOS JDK 설치 ― …CentOS JDK 설치 ― ElliottCentOS vsftpd 설치 및 설정 ― …CentOS에서 apt-get 실행해보기 ― …CentOS에서 apt-get 실행해보기 ― 다미안VirtualBox 리눅스 인터넷 연결 ― …VirtualBox 리눅스 인터넷 연결 ― JmnoteVirtualBox 리눅스 인터넷 연결 ― …리눅스 CPU 사용률 확인 ― 동원잉리눅스 JDK 버전 확인 ― …리눅스 JDK 버전 확인 ― Jmnote리눅스 SSH 패스워드 없이 자동 로그인 ― …리눅스 SSH 패스워드 없이 자동 로그인 ― Jmnote리눅스 날짜 기준으로 파일 삭제하기 ― 백승현리눅스 날짜 기준으로 파일 삭제하기 ― Jmnote리눅스 디렉토리 용량 확인 du ― …리눅스 메모리 사용률 확인 ― 최재완리눅스 메모리 사용률 확인 ― Jmnote좀비 프로세스 찾기, 죽이기 ― 불량펭귄