"리눅스 스크립트 백그라운드 실행"의 두 판 사이의 차이

 
(사용자 2명의 중간 판 6개는 보이지 않습니다)
22번째 줄: 22번째 줄:


==Foreground 실행 (중단됨)==
==Foreground 실행 (중단됨)==
<source lang='dos'>
<source lang='console'>
[root@jmnote ~]# sh test.sh
[root@zetawiki ~]# sh test.sh
</source>
</source>
:→ 가만히 놔두면 대략 200초(2초 X 100회)간 실행될 것이다.
:→ 가만히 놔두면 대략 200초(2초 X 100회)간 실행될 것이다.
29번째 줄: 29번째 줄:


SSH 클라이언트에서 강제로 연결을 끊은 후 다시 접속해보자.
SSH 클라이언트에서 강제로 연결을 끊은 후 다시 접속해보자.
<source lang='dos'>
<source lang='console'>
Last login: Tue Jun 25 17:08:14 2013 from 135.79.246.80
Last login: Tue Jun 25 17:08:14 2013 from 135.79.246.80
[root@jmnote ~]# ps -ef | grep -v grep | grep test.sh
[root@zetawiki ~]# ps -ef | grep -v grep | grep test.sh
</source>
</source>
:→ 프로세스가 중단되어서 없다.
:→ 프로세스가 중단되어서 없다.
<source lang='dos'>
<source lang='console'>
[root@jmnote ~]# cat test.log
[root@zetawiki ~]# cat test.log
[2013-06-25 17:11:11] i = 1
[2013-06-25 17:11:11] i = 1
[2013-06-25 17:11:13] i = 2
[2013-06-25 17:11:13] i = 2
44번째 줄: 44번째 줄:
==백그라운드 실행 (계속됨)==
==백그라운드 실행 (계속됨)==
백그라운드로 실행하면 SSH 접속이 끊겨도 계속 수행된다.
백그라운드로 실행하면 SSH 접속이 끊겨도 계속 수행된다.
<source lang='dos'>
<source lang='console'>
[root@jmnote ~]# sh test.sh &
[root@zetawiki ~]# sh test.sh &
[1] 2215
[1] 2215
</source>
</source>
51번째 줄: 51번째 줄:


2215번 프로세스의 계보를 살펴보자.
2215번 프로세스의 계보를 살펴보자.
<source lang='dos'>
<source lang='console'>
[root@jmnote ~]# ps -ef | grep -v grep | grep test.sh
[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      2215  2070  0 17:14 pts/0    00:00:00 sh test.sh
[root@jmnote ~]# ps -ef | grep -v grep | grep 2070
[root@zetawiki ~]# ps -ef | grep -v grep | grep 2070
root      2070  2068  0 17:11 pts/0    00:00:00 -bash
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      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      2272  2070  0 17:15 pts/0    00:00:00 ps -ef
[root@jmnote ~]# ps -ef | grep -v grep | grep 2068
[root@zetawiki ~]# ps -ef | grep -v grep | grep 2068
root      2068  1620  0 17:11 ?        00:00:00 sshd: root@pts/0  
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      2070  2068  0 17:11 pts/0    00:00:00 -bash
[root@jmnote ~]# ps -ef | grep -v grep | grep 1620
[root@zetawiki ~]# ps -ef | grep -v grep | grep 1620
root      1620    1  0 Jun15 ?        00:00:01 /usr/sbin/sshd
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      2068  1620  0 17:11 ?        00:00:00 sshd: root@pts/0
[root@jmnote ~]# ps -ef | grep -v grep | grep init
[root@zetawiki ~]# ps -ef | grep -v grep | grep init
root        1    0  0 Jun15 ?        00:00:00 init [3]   
root        1    0  0 Jun15 ?        00:00:00 init [3]   
[root@jmnote ~]# exit
[root@zetawiki ~]# exit
</source>
</source>
정리하면 test.sh은 다음과 같은 구조로 실행되고 있다.
정리하면 test.sh은 다음과 같은 구조로 실행되고 있다.
* 1 init [3]
 
** 1620 /usr/sbin/sshd
:▹ 1 init [3]
*** 2068 sshd: root@pts/0  
::▹ 1620 /usr/sbin/sshd
**** 2070 -bash
:::▹ 2068 sshd: root@pts/0  
***** 2215 sh test.sh
::::▹ 2070 -bash
:::::▹ 2215 sh test.sh
 
이러한 구조는 Foreground 실행시에도 동일하다.
이러한 구조는 Foreground 실행시에도 동일하다.
Foreground 실행시에는 SSH 접속을 끊으면 <code>sshd: root@pts/0</code> 프로세스가 종료되면서 하위 프로세스들도 종료된다.
Foreground 실행시에는 SSH 접속을 끊으면 <code>sshd: root@pts/0</code> 프로세스가 종료되면서 하위 프로세스들도 종료된다.


백그라운드 실행시에는 어떻게 되는지 다시 접속하여 확인해보자.
백그라운드 실행시에는 어떻게 되는지 다시 접속하여 확인해보자.
<source lang='dos'>
<source lang='console'>
Last login: Tue Jun 25 17:11:34 2013 from 135.79.246.80
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@zetawiki ~]# ps -ef | grep -v grep | grep test.sh
root      2215    1  0 17:14 ?        00:00:00 sh test.sh
root      2215    1  0 17:14 ?        00:00:00 sh test.sh
</source>
</source>
:→ PID는 2215번 그대로이지만, 부모프로세스가 init(1)으로 바뀌어서 계속 실행되고 있다.
:→ PID는 2215번 그대로이지만, 부모프로세스가 init(1)으로 바뀌어서 계속 실행되고 있다.
<source lang='dos'>
<source lang='console'>
[root@jmnote ~]# tail -f test.log
[root@zetawiki ~]# tail -f test.log
[2013-06-25 17:16:50] i = 59
[2013-06-25 17:16:50] i = 59
[2013-06-25 17:16:52] i = 60
[2013-06-25 17:16:52] i = 60
95번째 줄: 97번째 줄:


==같이 보기==
==같이 보기==
*[[PHP 배치 백그라운드 실행]]
* [[PHP 배치 백그라운드 실행]]
*[[무한반복 리눅스 스크립트]]
* [[무한반복 리눅스 스크립트]]
*[[리눅스 포트 LISTEN]]
* [[리눅스 포트 LISTEN]]
*[[init]]
* [[리눅스 bg]]
* [[리눅스 fg]]
* [[init]]
* [[백그라운드 프로세스]]


[[분류: 리눅스]]
[[분류: 리눅스]]

2017년 10월 8일 (일) 14:10 기준 최신판

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 }}