Linux 백그라운드 프로세스 관리

LinuxBeginner
지금 연습하기

소개

Linux 는 여러 프로세스를 동시에 관리할 수 있는 강력한 기능을 제공합니다. 그 핵심 기능 중 하나는 백그라운드에서 프로세스를 실행하는 기능으로, 긴 시간이 소요되는 프로세스가 실행되는 동안에도 다른 작업을 위해 터미널을 계속 사용할 수 있게 해줍니다.

이 랩에서는 Linux 시스템에서 백그라운드 프로세스를 관리하기 위한 필수적인 기술을 배우게 됩니다. 이러한 기술은 명령줄 환경에서 효율적인 멀티태스킹에 매우 중요하며, 시스템 관리자 및 개발자가 자주 사용합니다.

이 랩을 마치면 백그라운드 프로세스를 시작하고, 상태를 모니터링하며, 효과적으로 제어하는 방법을 이해하게 될 것입니다. 이러한 기술은 시스템 리소스를 더 잘 활용하고 Linux 시스템으로 작업할 때 생산성을 향상시키는 데 도움이 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 95%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

백그라운드에서 프로세스 시작

Linux 에서는 명령 끝에 앰퍼샌드 (&) 문자를 추가하여 명령을 백그라운드에서 실행할 수 있습니다. 이렇게 하면 셸이 프로세스를 백그라운드에서 실행하도록 지시하여 명령이 실행되는 동안 터미널을 계속 사용할 수 있습니다.

긴 시간이 소요되는 프로세스를 시뮬레이션하는 간단한 스크립트를 생성하고 실행해 보겠습니다.

먼저, 프로젝트 디렉토리에 있는지 확인합니다.

cd ~/project

이제 nano 텍스트 편집기를 사용하여 long_running.sh라는 스크립트 파일을 생성해 보겠습니다.

nano ~/project/long_running.sh

nano 편집기가 열리면 다음 코드를 입력합니다.

#!/bin/bash
echo "Starting a long process..."
sleep 600
echo "Process completed"

이 스크립트는 다음을 수행합니다.

  1. 시작 메시지를 출력합니다.
  2. 10 분 동안 일시 중지합니다 (시간이 오래 걸리는 작업을 시뮬레이션).
  3. 완료 메시지를 출력합니다.

nano 에서 파일을 저장하려면:

  1. Ctrl + O를 눌러 파일을 씁니다.
  2. Enter를 눌러 파일 이름을 확인합니다.
  3. Ctrl + X를 눌러 nano 를 종료합니다.

다음으로, 스크립트를 실행 가능하게 만들어야 합니다.

chmod +x ~/project/long_running.sh

이제 스크립트가 어떻게 작동하는지 확인하기 위해 먼저 포그라운드에서 실행해 보겠습니다.

./long_running.sh

다음과 같은 출력을 볼 수 있습니다.

Starting a long process...

스크립트가 완료될 때까지 터미널이 15 초 동안 점유되어 있음을 알 수 있습니다. 이 시간 동안 새 명령을 입력할 수 없습니다.

이제 앰퍼샌드 (&) 를 끝에 추가하여 동일한 스크립트를 백그라운드에서 실행해 보겠습니다.

./long_running.sh &

다음과 유사한 출력을 볼 수 있습니다.

[1] 1234
Starting a long process...

출력은 다음을 보여줍니다.

  • [1] - 셸에서 할당한 작업 번호
  • 1234 - 프로세스 ID (PID), 시스템에 따라 다른 번호가 됩니다.
  • 스크립트의 시작 메시지

스크립트가 여전히 실행 중이지만 셸 프롬프트가 즉시 반환되어 새 명령을 입력할 수 있습니다. 15 초 후에 완료 메시지가 나타납니다.

Process completed
[1]+  Done                    ./long_running.sh

이는 백그라운드 프로세스가 실행을 완료했음을 확인합니다.

백그라운드 프로세스 보기

백그라운드에서 프로세스를 시작한 후에는 이를 추적하는 방법을 알아야 합니다. Linux 는 현재 터미널 세션에서 실행 중인 모든 백그라운드 프로세스를 표시하기 위해 jobs 명령을 제공합니다.

여러 백그라운드 프로세스를 시작한 다음 이를 확인해 보겠습니다.

## Start the first background process
./long_running.sh &

다음과 유사한 출력을 볼 수 있습니다.

[1] 1234
Starting a long process...

이제 두 번째 백그라운드 프로세스를 시작합니다.

## Start the second background process
./long_running.sh &

다음과 유사한 출력을 볼 수 있습니다.

[2] 1235
Starting a long process...

모든 백그라운드 프로세스 (작업) 를 보려면 jobs 명령을 사용합니다.

jobs

다음과 유사한 출력을 볼 수 있습니다.

[1]  Running                 ./long_running.sh &
[2]- Running                 ./long_running.sh &

이는 두 개의 백그라운드 작업이 실행 중임을 보여줍니다. 대괄호 안의 숫자는 다른 명령으로 특정 작업을 참조하는 데 사용할 수 있는 작업 ID 입니다.

jobs 명령은 몇 가지 유용한 옵션을 지원합니다.

  • jobs -l - 작업 정보와 함께 프로세스 ID 를 표시합니다.
  • jobs -p - 작업의 프로세스 ID 만 표시합니다.

-l 옵션을 사용하여 자세한 내용을 확인해 보십시오.

jobs -l

출력에는 프로세스 ID 가 포함됩니다.

[1]  1234 Running                 ./long_running.sh &
[2]- 1235 Running                 ./long_running.sh &

다음 단계로 넘어가기 전에 두 프로세스가 모두 완료될 때까지 기다립니다. 다음과 같은 메시지를 볼 수 있습니다.

Process completed
[1]+  Done                    ./long_running.sh
Process completed
[2]+  Done                    ./long_running.sh

프로세스 포그라운드와 백그라운드 간 이동

Linux 에서는 프로세스를 포그라운드와 백그라운드 상태 간에 이동할 수 있습니다. 이는 특히 다음과 같은 경우에 유용합니다.

  • 포그라운드에서 프로세스를 시작했고 다른 용도로 터미널을 사용해야 하는 경우
  • 백그라운드 프로세스를 포그라운드로 가져와 상호 작용하려는 경우

fg (foreground) 및 bg (background) 명령과 프로세스 일시 중단을 사용하여 이를 수행하는 방법을 알아보겠습니다.

먼저, 긴 시간이 소요되는 스크립트를 포그라운드에서 시작합니다 ( & 없이).

./long_running.sh

다음과 같은 출력을 볼 수 있습니다.

Starting a long process...

셸 프롬프트가 반환되지 않음을 알 수 있습니다. 터미널은 이제 포그라운드에서 실행 중인 이 프로세스에 의해 점유됩니다.

이 프로세스를 일시 중단 (일시 중지) 하고 터미널 제어를 되찾으려면:

  1. Ctrl + Z를 누릅니다.

다음과 유사한 출력을 볼 수 있습니다.

^Z
[1]+  Stopped                 ./long_running.sh

이제 프로세스가 일시 중단되어 실행되지 않습니다. jobs 명령으로 이를 확인할 수 있습니다.

jobs

출력:

[1]+  Stopped                 ./long_running.sh

일시 중단된 프로세스를 백그라운드에서 다시 시작하려면 bg 명령을 사용합니다.

bg %1

%1은 작업 번호 1 을 나타냅니다. 다음을 볼 수 있습니다.

[1]+ ./long_running.sh &

이제 프로세스가 백그라운드에서 실행 중입니다. jobs로 확인합니다.

jobs

출력:

[1]+  Running                 ./long_running.sh &

백그라운드 프로세스를 포그라운드로 가져오려면 fg 명령을 사용합니다.

fg %1

이제 프로세스가 다시 포그라운드에서 실행되고 터미널은 완료될 때까지 점유됩니다.

./long_running.sh
Process completed

프로세스가 완료되면 셸 프롬프트가 반환됩니다.

터미널 종료 후에도 프로세스 실행 유지

&를 사용하여 백그라운드에서 프로세스를 실행하면 터미널을 닫으면 종료됩니다. 터미널을 닫은 후에도 프로세스를 계속 실행하려면 nohup 명령을 사용할 수 있습니다.

nohup ( "no hang up"의 약자) 는 터미널이 닫힐 때 프로세스에 전송되는 SIGHUP (hang up) 신호를 프로세스가 수신하지 못하도록 합니다.

스크립트를 수정하여 더 오래 실행되도록 해 보겠습니다.

nano ~/project/long_running.sh

내용을 다음과 같이 업데이트합니다.

#!/bin/bash
echo "Starting a very long process..."
sleep 60
echo "Process completed" > ~/project/completed.txt

nano 를 저장하고 종료합니다 (Ctrl+O, Enter, Ctrl+X).

이제 nohup으로 스크립트를 실행해 보겠습니다.

nohup ./long_running.sh &

다음과 유사한 출력을 볼 수 있습니다.

[1] 1234
nohup: ignoring input and appending output to 'nohup.out'

스크립트의 출력은 터미널에 표시되지 않습니다. 대신 nohup.out이라는 파일로 리디렉션됩니다. 이 파일을 확인할 수 있습니다.

cat nohup.out

다음과 같은 내용을 볼 수 있습니다.

Starting a very long process...

이제 터미널을 닫더라도 프로세스는 계속 실행됩니다. 완료되면 nohup.outcompleted.txt에 모두 기록됩니다.

모든 터미널에서 백그라운드로 실행 중인 프로세스를 보려면 ps 명령을 사용합니다.

ps aux | grep long_running.sh

다음과 유사한 내용을 볼 수 있습니다.

labex     1234  0.0  0.0   8160   736 pts/0    S    12:34   0:00 /bin/bash ./long_running.sh
labex     1235  0.0  0.0  14428  1020 pts/0    S+   12:34   0:00 grep --color=auto long_running.sh

프로세스가 완료될 때까지 기다립니다 (또는 원하는 경우 종료합니다).

## If you want to terminate the process:
kill %1

요약

이 랩에서는 Linux 에서 백그라운드 프로세스를 관리하기 위한 필수 기술을 배웠습니다.

  1. 백그라운드 프로세스 시작 (Starting Background Processes): & 연산자를 사용하여 백그라운드에서 프로세스를 시작하는 방법을 배웠으며, 이를 통해 프로세스가 실행되는 동안 터미널을 계속 사용할 수 있습니다.

  2. 백그라운드 프로세스 보기 (Viewing Background Processes): 현재 터미널 세션에서 실행 중인 모든 백그라운드 프로세스를 보려면 jobs 명령을 사용했습니다.

  3. 포그라운드와 백그라운드 간 프로세스 이동 (Moving Processes Between Foreground and Background): Ctrl+Z를 사용하여 프로세스를 일시 중단하고, bg를 사용하여 백그라운드에서 계속 실행하고, fg를 사용하여 포그라운드로 가져오는 연습을 했습니다.

  4. 터미널을 닫은 후에도 프로세스 실행 유지 (Keeping Processes Running After Terminal Closes): nohup 명령을 사용하여 터미널 세션이 종료된 후에도 프로세스를 계속 실행했습니다.

이러한 기술은 Linux 환경에서 효과적인 멀티태스킹에 필수적입니다. 이를 통해 여러 프로세스를 동시에 실행하고, 터미널 리소스를 효율적으로 사용하며, 터미널을 열어두지 않고도 장시간 실행되는 프로세스를 유지하고, 프로세스 실행 상태를 관리할 수 있습니다.

이러한 기술을 통해 서버 관리, 애플리케이션 개발 또는 시스템 관리 작업을 수행하는 등 Linux 명령줄 환경에서 보다 효율적이고 효과적으로 작업할 수 있습니다.