본문으로 바로가기

목차

    1. 포그라운드와 백그라운드

    프로세스 작업 제어

    1.1. 포그라운드(Foreground)

    입력한 명령어 실행이 결과가 나올 때까지 기다리는 방식

    한 동작을 수행할 동안 다른 동작은 할 수 없는 상태

    포그라운드 작업: 사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 기다려야 하는 방식

    1.2. 백그라운드(Background)

    하나의 쉘(터미널)에서 여러 개의 프로세스를 동시에 실행할 수 있는 방식

     한 동작을 수행하는 동안에도 다른 동작을 할 수 있는 상태

     해당 명령어 처리가 오래 걸릴걸 대비해 백그라운드를 이용하면 여러 작업을 동시에 수행할 수 있다.

    필요한 여러 작업을 백그라운드로 실행한 후 터미널에서는 포그라운드 작업을 계속 진행할 수 있다.

     


    2. 프로세스 실행

    2.1. 포그라운드 작업

    일반적인 명령어 실행 방식입니다.

    다음은 vi를 이용해 파일을 열은 상태인데 작업이 끝날 때까지 다른 작업을 동시에 수행할 수 없습니다.

    2.2. 백그라운드 작업

    # 명령어 &

     : 이 방식의 백그라운드 프로세스 실행은 터미널이 끊기면 실행이 멈춰지게 됩니다.

     

    # nohup 명령어 &

     : 이 방식의 백그라운드 프로세스 실행은 터미널 연결이 끊어져도 실행을 멈추지 않습니다.

     : No Hang Up Signal 

    [
      백그라운드에서 실행시킬 스크립트 파일 내용
      1초마다 카운트하여 number.txt 파일에 기록하는 스크립트 파일
    ]
    
    # cat test.sh
    
    number=0
    
    while true; do
    
            sleep 1
            number=`expr $number + 1`
            echo ${number} >> number.txt
    
    done
    [백그라운드 실행]
    # sh test.sh &
    
    또는
    # nohup sh test.sh &
    
    또는(nohup 파일을 생성하지 않음) 
    # nohup sh test.sh 1>/dev/null 2>&1 &
    
    [2] 30870
    
    [백그라운드 실행 확인]
    # tail -f number.txt
    8
    9
    ( ... ) 생략
    
    [프로세스 확인]
    # ps -ef | grep test.sh | grep -v grep
    root     30870 15023  0 20:47 pts/1    00:00:00 sh test.sh
    
    [백그라운드 프로세스 종료]
    # kill -9 30870
    또는
    # kill -9 `ps -ef | grep test.sh | grep -v grep | awk '{print $2}'`

     

     


    3. 프로세스 전환

    3.1. jobs 명령어

     백그라운드로 실행되는 작업목록(작업번호, 상태, 명령어)을 보여주는 리눅스 명령어

     현재 쉘(터미널)에서 작업이 중지된 상태나 백그라운드로 진행 중인 상태를 출력하는 명령어

    nohup 명령어로 실행된 백그라운드 프로세스일지라도 현재 쉘(터미널)이 끊길경우 포그라운드로 전환할 수도 없고 jobs에 출력되지 않습니다. 

    # jobs [-lnprs] [Job ID]

     

    백그라운드 프로세스 종료(%필수 입니다.)

    # kill %작업번호

     

    [OPTIONS]

     -l

     : 프로세스 ID를 state 필드 앞에 출력

     -n

     : 프로세스 그룹 중에 대표 프로세스 ID 출력

     -p

     : 프로세스 ID만 출력

     -r

     : 실행 중인 작업만 출력

     -s

     : 정지한 작업만 출력

    [
      필드 값: 작업번호, 작업순서(+,-), 상태, 명령
      작업번호와 PID는 다릅니다.
      작업순서표시
      	+ : 가장 최근에 접근한 작업
        - : + 작업 전에 접근한 작업
    ]
    # jobs
    [1]-  Running                 nohup sh server_check.sh > /dev/null 2>&1 &
    [2]+  Running                 sh test.sh &
    
    [1번 작업 출력]
    # jobs 1
    [1]-  Running                 nohup sh server_check.sh > /dev/null 2>&1 &
    
    [필드 값: 작업번호, 작업순서, PID, 상태, 명령]
    # jobs -l
    [1]-  6438 Running                 nohup sh server_check.sh > /dev/null 2>&1 &
    [2]+  7280 Running                 sh test.sh &
    
    [PID 출력]
    # jobs -p
    6438
    7280
    
    [실행중인 백그라운드 프로세스 출력]
    # jobs -r
    [1]-  Running                 nohup sh server_check.sh > /dev/null 2>&1 &
    [2]+  Running                 sh test.sh &
    
    [백그라운드 프로세스 종료]
    # kill %2

    3.2. 포그라운드 → 백그라운드

    전환을 위해 포그라운드 프로세스는 정지를 시키고 백그라운드 프로세스로 전환해야 합니다. 

    포그라운드 프로세스 → 프로세스 정지 → 백그라운드 프로세스 전환 

    # bg %작업번호

    작업 번호는 생략 가능합니다.(순차적으로 알아서 작업 번호가 추가됩니다.)

     

    리눅스 단축키

    Ctrl+D : 프로세스 정상종료

    Ctrl+C : 프로세스 강제종료
    Ctrl+Z : 프로세스 정지 (Stop)

    [1. 포그라운드로 실행]
    # sh test.sh
    
    [2. Ctrl + z를 이용해 중지 상태로 변경]
    ^Z
    [2]+  Stopped                 sh test.sh
    
    # jobs
    [1]-  Running                 nohup sh server_check.sh > /dev/null 2>&1 &
    [2]+  Stopped                 sh test.sh
    
    [3. bg 명령어를 이용해 백그라운드로 전환]
    # bg
    [2]+ sh test.sh &
    
    # jobs
    [1]-  Running                 nohup sh server_check.sh > /dev/null 2>&1 &
    [2]+  Running                 sh test.sh &

    3.3. 백그라운드 → 포그라운드

    # fg %작업번호

    [1. 백그라운드 프로세스 상태 확인]
    # jobs
    [1]-  Running                 nohup sh server_check.sh > /dev/null 2>&1 &
    [2]+  Running                 sh test.sh &
    
    [2. [2]번 백그라운드 작업 포그라운드로 전환]
    # fg %2
    sh test.sh