Linux에서 백그라운드 프로세스를 실행하고 제어하는 ​​방법

Linux에서 Bash 셸을 사용하여 포그라운드 및 백그라운드 프로세스를 관리합니다. Bash의 작업 제어 기능과 신호를 사용하여 명령을 실행하는 방법에 더 많은 유연성을 제공할 수 있습니다. 우리는 방법을 보여줍니다.

프로세스에 관한 모든 것

Linux 또는 Unix 계열 운영 체제에서 프로그램이 실행될 때마다 프로세스가 시작됩니다. “프로세스”는 컴퓨터 메모리에서 실행 중인 프로그램의 내부 표현에 대한 이름입니다. 모든 활성 프로그램에는 프로세스가 있습니다. 사실, 컴퓨터에서 실행되는 거의 모든 것에 대한 프로세스가 있습니다. 여기에는 그래픽 데스크탑 환경 (GDE)와 같은 금언 또는 KDE, 시스템 데몬 시작할 때 시작됩니다.

거의 모든 것이 실행되는 이유는 무엇입니까? 음, 다음과 같은 Bash 내장 CD, 암호, 그리고 별명 실행될 때 프로세스를 시작(또는 “생성”)할 필요가 없습니다. Bash는 터미널 창에서 실행 중인 Bash 셸의 인스턴스 내에서 이러한 명령을 실행합니다. 이러한 명령은 실행을 위해 프로세스를 시작할 필요가 없기 때문에 정확하게 빠릅니다. (터미널 창에 help를 입력하면 Bash 내장 목록을 볼 수 있습니다.)

프로세스는 포그라운드에서 실행될 수 있으며, 이 경우 완료될 때까지 터미널을 인수하거나 백그라운드에서 실행할 수 있습니다. 백그라운드에서 실행되는 프로세스는 터미널 창을 지배하지 않으며 계속해서 작업할 수 있습니다. 또는 적어도 화면 출력을 생성하지 않으면 터미널 창을 지배하지 않습니다.

지저분한 예

간단한 ping을 시작하겠습니다. 추적 실행. How-To Geek 도메인을 ping할 것입니다. 이것은 포그라운드 프로세스로 실행됩니다.

ping www.wdzwdz.com

터미널 창을 아래로 스크롤하여 예상한 결과를 얻습니다. ping이 실행되는 동안 터미널 창에서 다른 작업을 수행할 수 없습니다. 명령을 종료하려면 Ctrl+C를 누르십시오.

Ctrl+C

Ctrl+C의 가시적 효과는 스크린샷에서 강조 표시됩니다. ping은 짧은 요약을 제공한 다음 중지합니다.

반복합시다. 그러나 이번에는 Ctrl+C 대신 Ctrl+Z를 누릅니다. 작업이 종료되지 않습니다. 백그라운드 작업이 됩니다. 반환된 터미널 창에 대한 제어 권한을 얻습니다.

ping www.wdzwdz.com
Ctrl+Z

Ctrl+Z를 누르면 보이는 효과가 스크린샷에서 강조 표시됩니다.

이번에는 프로세스가 중지되었다고 합니다. 중지는 종료를 의미하지 않습니다. 정지 신호에 있는 자동차와 같습니다. 우리는 그것을 스크랩하고 버리지 않았습니다. 그것은 여전히 ​​길에 있고, 정지되어 있고, 가기를 기다리고 있습니다. 프로세스는 이제 백그라운드 작업입니다.

작업 명령 작업을 나열합니다 현재 터미널 세션에서 시작된 그리고 작업은 (필연적으로) 프로세스이기 때문에 ps 명령을 사용하여 볼 수도 있습니다. 두 명령을 모두 사용하고 출력을 비교해 보겠습니다. T 옵션(터미널) 옵션을 사용하여 이 터미널 창에서 실행 중인 프로세스만 나열합니다. T 옵션과 함께 하이픈을 사용할 필요가 없습니다.

jobs
ps T

작업 명령은 다음을 알려줍니다.

  iPhone, iPad 및 Mac에서 Apple Notes를 잠그는 방법

[1]: 대괄호 안의 숫자는 작업 번호입니다. 작업 제어 명령으로 작업을 제어해야 할 때 이것을 사용하여 작업을 참조할 수 있습니다.
+: 더하기 기호 +는 특정 작업 번호 없이 작업 제어 명령을 사용하는 경우 작동할 작업임을 나타냅니다. 기본 작업이라고 합니다. 기본 작업은 항상 작업 목록에 가장 최근에 추가된 작업입니다.
중지됨: 프로세스가 실행되고 있지 않습니다.
ping www.wdzwdz.com: 프로세스를 시작한 명령줄.

ps 명령은 다음과 같이 알려줍니다.

PID: 프로세스의 프로세스 ID입니다. 각 프로세스에는 고유한 ID가 있습니다.
TTY: 프로세스가 실행된 의사 텔레타이프(터미널 창)입니다.
STAT: 프로세스의 상태입니다.
TIME: 프로세스가 소비한 CPU 시간.
COMMAND: 프로세스를 시작한 명령입니다.

다음은 STAT 열에 대한 공통 값입니다.

D: 중단 없는 수면. 프로세스는 일반적으로 입력 또는 출력을 기다리는 대기 상태이며 중단될 수 없습니다.
나: 유휴.
R: 실행 중입니다.
S: 중단 가능한 수면.
T: 작업 제어 신호에 의해 중지되었습니다.
Z: 좀비 프로세스입니다. 프로세스가 종료되었지만 상위 프로세스에 의해 “정리”되지 않았습니다.

STAT 열의 값 다음에 다음 추가 표시기 중 하나가 올 수 있습니다.

<: high-priority="" task="" nice="" to="" other="" processes="" n:="" low-priority="" l:="" process="" has="" pages="" locked="" into="" memory="" used="" by="" real-time="" s:="" a="" session="" leader.="" leader="" is="" that="" launched="" groups.="" shell="" multi-thread="" process.="" foreground="">우리는 Bash의 상태가 Ss임을 알 수 있습니다. 대문자 “S”는 Bash 셸이 잠자기 중이며 인터럽트할 수 있음을 알려줍니다. 우리가 그것을 필요로 하는 즉시 응답할 것입니다. 소문자 “s”는 쉘이 세션 리더임을 알려줍니다.

ping 명령의 상태는 T입니다. 이것은 ping이 작업 제어 신호에 의해 중지되었음을 알려줍니다. 이 예에서 그것은 우리가 그것을 배경에 넣는 데 사용한 Ctrl+Z였습니다.

ps T 명령은 실행을 나타내는 R 상태를 갖습니다. +는 이 프로세스가 전경 그룹의 구성원임을 나타냅니다. 따라서 ps T 명령은 포그라운드에서 실행됩니다.

bg 명령

bg 명령은 백그라운드 프로세스를 재개하는 데 사용됩니다. 작업 번호와 함께 또는 없이 사용할 수 있습니다. 작업 번호 없이 사용하면 기본 작업이 포그라운드로 가져옵니다. 프로세스는 여전히 백그라운드에서 실행됩니다. 입력을 보낼 수 없습니다.

bg 명령을 실행하면 ping 명령을 다시 시작합니다.

bg

ping 명령이 다시 시작되고 터미널 창에 스크롤링 출력이 한 번 더 표시됩니다. 다시 시작된 명령의 이름이 표시됩니다. 이것은 스크린샷에 강조 표시되어 있습니다.

  Microsoft Word 문서를 CSV 파일로 변경하는 방법

하지만 문제가 있습니다. 작업이 백그라운드에서 실행 중이며 입력을 수락하지 않습니다. 그럼 어떻게 멈출까요? Ctrl+C는 아무 것도 하지 않습니다. 우리는 그것을 입력할 때 그것을 볼 수 있지만 백그라운드 작업은 이러한 키 입력을 받지 않으므로 계속 즐겁게 핑을 댑니다.

사실, 우리는 지금 이상한 혼합 모드에 있습니다. 터미널 창에 입력할 수 있지만 입력한 내용은 ping 명령의 스크롤 출력에 의해 빠르게 지워집니다. 우리가 입력하는 모든 것은 전경에 적용됩니다.

백그라운드 작업을 중지하려면 전경으로 가져온 다음 중지해야 합니다.

fg 명령

fg 명령은 백그라운드 작업을 포그라운드로 가져옵니다. bg 명령과 마찬가지로 작업 번호와 함께 또는 없이 사용할 수 있습니다. 작업 번호와 함께 사용하면 특정 작업에서 작동한다는 의미입니다. 작업 번호 없이 사용되는 경우 백그라운드로 전송된 마지막 명령이 사용됩니다.

fg를 입력하면 ping 명령이 포그라운드로 이동합니다. 우리가 입력하는 문자는 ping 명령의 출력과 혼합되지만 평소와 같이 명령줄에 입력된 것처럼 쉘에 의해 작동됩니다. 그리고 사실, Bash 셸의 관점에서 보면 그것이 정확히 일어난 일입니다.

fg

이제 포그라운드에서 ping 명령이 다시 실행되었으므로 Ctrl+C를 사용하여 종료할 수 있습니다.

Ctrl+C

올바른 신호를 보내야 합니다.

그것은 정확히 아름답지 않았습니다. 분명히 백그라운드에서 프로세스를 실행하는 것은 프로세스가 출력을 생성하지 않고 입력이 필요하지 않을 때 가장 잘 작동합니다.

그러나 지저분하든 아니든 우리의 예는 다음을 수행했습니다.

프로세스를 배경에 넣습니다.
백그라운드에서 실행 중인 상태로 프로세스를 복원합니다.
프로세스를 전경으로 되돌립니다.
프로세스를 종료합니다.

Ctrl+C 및 Ctrl+Z 를 사용하면 프로세스에 신호를 보내는 것입니다. 이것들은 속기법 kill 명령을 사용하는 것입니다. 있다 64개의 다른 신호 그 살인은 보낼 수 있습니다. 명령줄에서 kill -l을 사용하여 나열합니다. kill이 이러한 신호의 유일한 소스는 아닙니다. 그들 중 일부는 시스템 내의 다른 프로세스에 의해 자동으로 발생합니다.

다음은 일반적으로 사용되는 몇 가지입니다.

SIGHUP: 신호 1. 실행 중인 터미널이 닫힐 때 프로세스에 자동으로 전송됩니다.
SIGINT: 신호 2. Ctrl+C를 누른 프로세스로 전송됩니다. 프로세스가 중단되고 종료하라는 메시지가 표시됩니다.
SIGQUIT: 신호 3. 사용자가 종료 신호 Ctrl+D를 보내면 프로세스에 보냅니다.
SIGKILL: 신호 9. 프로세스가 즉시 종료되고 완전히 종료하려고 시도하지 않습니다. 프로세스가 정상적으로 진행되지 않습니다.
SIGTERM: 신호 15. 이것은 kill이 보내는 기본 신호입니다. 표준 프로그램 종료 신호입니다.
SIGTSTP: 신호 20. Ctrl+Z를 사용할 때 프로세스로 전송됩니다. 프로세스를 중지하고 백그라운드에 넣습니다.

  Apple Watch에서 추락 감지를 활성화하고 비상 연락처를 설정하는 방법

키 조합이 할당되지 않은 신호를 발행하려면 kill 명령을 사용해야 합니다.

추가 작업 제어

Ctrl+Z를 사용하여 백그라운드로 이동한 프로세스는 중지된 상태가 됩니다. 다시 실행하려면 bg 명령을 사용해야 합니다. 실행 중인 백그라운드 프로세스로 프로그램을 시작하는 것은 간단합니다. 명령줄 끝에 앰퍼샌드 &를 추가합니다.

백그라운드 프로세스가 터미널 창에 쓰지 않는 것이 가장 좋지만 그렇게 하는 예제를 사용할 것입니다. 스크린샷에 참조할 수 있는 내용이 있어야 합니다. 이 명령은 백그라운드 프로세스로 무한 루프를 시작합니다.

사실이지만; do echo “긱 루프 프로세스 방법”; 수면 3; 완료 &

사실이지만;  에코를 하다

프로세스의 작업 번호와 프로세스 ID ID를 알려줍니다. 작업 번호는 1이고 프로세스 ID는 1979입니다. 이러한 식별자를 사용하여 프로세스를 제어할 수 있습니다.

끝없는 루프의 출력이 터미널 창에 나타나기 시작합니다. 이전과 마찬가지로 명령줄을 사용할 수 있지만 우리가 실행하는 모든 명령은 루프 프로세스의 출력에 산재되어 있습니다.

프로세스를 중지하기 위해 작업을 사용하여 작업 번호가 무엇인지 상기시킨 다음 kill을 사용할 수 있습니다.

작업은 우리 프로세스가 작업 번호 1이라고 보고합니다. 이 번호를 kill과 함께 사용하려면 앞에 퍼센트 기호 %를 붙여야 합니다.

jobs
kill %1

kill은 SIGTERM 신호, 신호 번호 15를 프로세스에 보내고 종료됩니다. 다음에 Enter 키를 누르면 작업 상태가 표시됩니다. 프로세스가 “종료됨”으로 나열됩니다. 프로세스가 kill 명령에 응답하지 않으면 한 단계 업그레이드할 수 있습니다. kill 을 SIGKILL , 신호 번호 9 와 함께 사용하십시오. kill 명령 작업 번호 사이에 숫자 9 를 넣으면 됩니다.

kill 9 %1

우리가 다룬 것들

Ctrl+C: 입력을 수락하는 경우 프로세스에 SIGINT, 신호 2를 보내고 종료하도록 지시합니다.
Ctrl+D: 입력을 수락하는 경우 프로세스에 SISQUIT, 신호 3을 보내고 종료하도록 지시합니다.
Ctrl+Z: SIGSTP, 신호 20을 프로세스에 보내고 중지(일시 중단)하고 백그라운드 프로세스가 되도록 지시합니다.
작업: 백그라운드 작업을 나열하고 작업 번호를 표시합니다.
bg job_number: 백그라운드 프로세스를 다시 시작합니다. 작업 번호를 제공하지 않으면 백그라운드 작업으로 전환된 마지막 프로세스가 사용됩니다.
fg job_number: 백그라운드 프로세스를 포그라운드로 가져와 다시 시작합니다. 작업 번호를 제공하지 않으면 백그라운드 작업으로 전환된 마지막 프로세스가 사용됩니다.
명령줄 &: 명령줄 끝에 앰퍼샌드 &를 추가하면 해당 명령이 실행 중인 백그라운드 작업으로 실행됩니다.
kill %job_number: SIGTERM, 신호 15를 프로세스에 전송하여 프로세스를 종료합니다.
kill 9 %job_number: SIGKILL, 신호 9를 프로세스에 보내고 갑자기 종료합니다.