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

0
638
Linux 컴퓨터의 쉘 환경
Fatmawati Achmad Zaenuri / Shutterstock.com

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

프로세스에 관한 모든 것

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

거의 실행중인 모든 것? cd, pwd 및 alias와 같은 Bash 내장 기능은 프로세스가 실행될 때 시작되거나 “발산”될 필요가 없습니다. Bash는 터미널 창에서 실행되는 Bash 쉘 인스턴스 내에서 이러한 명령을 실행합니다. 이 명령들은 프로세스를 실행할 필요가 없기 때문에 정확합니다. (입력 할 수 있습니다 help 터미널 창에서 Bash 내장 목록을 볼 수 있습니다.)

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

지저분한 예

우리는 간단한 시작합니다 ping 추적 실행. 우리는 ping How-To Geek 도메인. 포 그라운드 프로세스로 실행됩니다.

ping www.howtogeek.com

터미널 창에서 www.howtogeek.com 핑

터미널 창을 아래로 스크롤하여 예상 결과를 얻습니다. 터미널 창에서 다른 작업을 수행 할 수 없습니다 ping 실행 중입니다. 명령을 종료하려면 Ctrl+C.

Ctrl+C

터미널 창에서 ping 추적 출력

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

반복 해 봅시다. 하지만 이번에는 Ctrl+Z 대신에 Ctrl+C. 작업이 종료되지 않습니다. 백그라운드 작업이됩니다. 우리는 터미널 창을 우리에게 돌려줍니다.

ping www.howtogeek.com
Ctrl+Z

터미널 창에서 실행되는 명령에서 Ctrl + Z의 효과

타격의 가시적 인 효과 Ctrl+Z 스크린 샷에서가 강조 표시됩니다.

이번에는 프로세스가 중지되었다는 메시지가 나타납니다. 중지되었다는 의미는 종료되지 않습니다. 정지 신호를받는 차와 같습니다. 우리는 그것을 폐기하지 않고 버렸습니다. 아직 움직이지 않고 고정되어 있습니다. 프로세스는 이제 배경입니다 .

그만큼 jobs 명령은 현재 터미널 세션에서 시작된 작업을 나열합니다. 그리고 작업은 (필연적으로) 프로세스이기 때문에 ps 그들을 볼 명령. 두 명령을 모두 사용하고 출력을 비교해 봅시다. 우리는 T 이 터미널 창에서 실행중인 프로세스 만 나열하는 옵션 (터미널) 옵션. 하이픈을 사용할 필요가 없습니다. - 이랑 T 선택권.

jobs
ps T

터미널 창에서 작업 명령

그만큼 jobs 명령은 우리에게 알려줍니다 :

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

그만큼 ps 명령은 우리에게 알려줍니다 :

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

STAT 열의 공통 값은 다음과 같습니다.

  • : 무정전 수면. 프로세스가 대기 상태에 있으며 일반적으로 입력 또는 출력을 기다리고 있으며 인터럽트 할 수 없습니다.
  • 나는: 유휴.
  • 아르 자형: 달리기.
  • 에스: 중단 가능한 수면.
  • : 작업 제어 신호에 의해 중지되었습니다.
  • : 좀비 프로세스. 프로세스가 종료되었지만 상위 프로세스에 의해 “정리”되지 않았습니다.

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

  • <: 우선 순위가 높은 작업 (다른 프로세스에는 좋지 않음).
  • : 우선 순위가 낮습니다 (다른 프로세스에 적합).
  • : 프로세스에 페이지가 메모리에 잠겨 있습니다 (일반적으로 실시간 프로세스에서 사용됨).
  • 에스: 세션 리더. 세션 리더는 프로세스 그룹을 시작한 프로세스입니다. 쉘은 세션 리더입니다.
  • : 멀티 스레드 프로세스.
  • +: 포 그라운드 프로세스.

우리는 Bash의 상태가 Ss. 대문자 “S”는 Bash 쉘이 잠자고 있음을 나타내며 인터럽트 가능합니다. 필요한대로 응답합니다. 소문자 “s”는 쉘이 세션 리더임을 나타냅니다.

ping 명령의 상태는 T. 이것은 우리에게 ping 작업 제어 신호에 의해 중지되었습니다. 이 예에서는 Ctrl+Z 우리는 그것을 배경에 넣었습니다.

그만큼 ps T 명령의 상태는 R, 이것은 달리기를 의미합니다. 그만큼 + 이 프로세스가 포 그라운드 그룹의 구성원임을 나타냅니다. 그래서 ps T 명령이 포 그라운드에서 실행 중입니다.

bg 명령

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

우리가 발행하면 bg 명령, 우리는 우리를 다시 시작합니다 ping 명령:

bg

터미널 창에서 bg

그만큼 ping 명령이 재개되고 터미널 창에 다시 스크롤 출력이 나타납니다. 재시작 된 명령의 이름이 표시됩니다. 스크린 샷에서 강조 표시됩니다.

터미널 창에서 출력 된 핑 백그라운드 프로세스 재개

그러나 문제가 있습니다. 작업이 백그라운드에서 실행 중이며 입력을받지 않습니다. 그래서 어떻게 막을까요? Ctrl+C 아무것도하지 않습니다. 입력 할 때 알 수 있지만 백그라운드 작업은 이러한 키 입력을받지 않으므로 핑 (ping)을 즐겁게 유지합니다.

터미널 창에서 Ctrl + C를 무시하는 백그라운드 작업

사실, 우리는 이제 이상한 혼합 모드에 있습니다. 터미널 창에 입력 할 수 있지만 입력 한 내용은 ping 명령. 우리가 입력하는 모든 것은 foregound에 적용됩니다.

백그라운드 작업을 중지하려면 포 그라운드로 가져 와서 중지해야합니다.

fg 명령

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

입력하면 fg 우리의 ping 명령이 포 그라운드로 이동합니다. 입력 한 문자는 ping 명령을 수행하지만 평소처럼 명령 행에 입력 한 것처럼 쉘에서 작동합니다. 사실, Bash 쉘의 관점에서 볼 때 그것은 정확히 일어난 일입니다.

fg

터미널 창에서 ping의 출력과 혼합 된 fg 명령

이제 우리는 ping 포 그라운드에서 다시 한 번 명령을 실행하면 Ctrl+C 그것을 죽일.

Ctrl+C

터미널 창에서 ping 명령을 중지하는 Ctrl + C

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

정확히 예쁘지 않았습니다. 프로세스가 출력을 생성하지 않고 입력이 필요하지 않은 경우 백그라운드에서 프로세스를 실행하는 것이 가장 효과적입니다.

그러나 지저분하지 않든, 우리의 모범은 다음을 달성했습니다.

  • 프로세스를 배경으로 진행
  • 백그라운드에서 프로세스를 실행 중 상태로 복원
  • 프로세스를 포 그라운드로 리턴
  • 프로세스 종료

사용할 때 Ctrl+CCtrl+Z 프로세스에 신호를 보내고 있습니다. 이들은 사용하는 속기 방법입니다 kill 명령. 64 가지 다른 신호가 있습니다 kill 보낼 수 있습니다. 사용하다 kill -l 명령 행에서 이들을 나열하십시오. kill 이 신호의 유일한 소스는 아닙니다. 그중 일부는 시스템 내의 다른 프로세스에 의해 자동으로 발생합니다.

다음은 일반적으로 사용되는 것들입니다.

  • SIGHUP: 신호 1. 실행중인 터미널이 닫히면 프로세스로 자동 전송됩니다.
  • 사인: 신호 2. 적중 한 프로세스로 보냄 Ctrl+C. 프로세스가 중단되고 종료하라는 메시지가 표시됩니다.
  • 시그 퀴트: 신호 3. 사용자가 종료 신호를 보내면 프로세스로 보냄 Ctrl+D.
  • 시킬: 신호 9. 프로세스가 즉시 종료되고 완전히 종료되지 않습니다. 프로세스가 정상적으로 진행되지 않습니다.
  • 시그넘: 신호 15.이 신호는 kill. 표준 프로그램 종료 신호입니다.
  • SIGTSTP: 신호 20. 사용할 때 프로세스로 보냄 Ctrl+Z. 프로세스를 중지하고 백그라운드에 넣습니다.

우리는 kill 키 조합이 할당되지 않은 신호를 발행하는 명령입니다.

추가 작업 제어

프로세스를 사용하여 백그라운드로 이동 Ctrl+Z 정지 상태에 놓입니다. 우리는 bg 명령을 다시 실행하십시오. 실행중인 백그라운드 프로세스로 프로그램을 시작하는 것은 간단합니다. 앰퍼샌드 추가 & 명령 줄 끝까지

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

사실이지만; echo“How-To Geek Loop Process”; 수면 3; 완료 및

사실이지만; echo "How-To Geek Loop Process"; 수면 3; 완료 및 터미널 창에서

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

무한 루프의 출력이 터미널 창에 나타나기 시작합니다. 이전과 마찬가지로 명령 행을 사용할 수 있지만 발행 한 모든 명령은 루프 프로세스의 출력과 함께 산재됩니다.

ls

다른 명령의 출력과 함께 산재 된 백그라운드 루프 프로세스의 출력

프로세스를 멈추기 위해 사용할 수 있습니다 jobs 작업 번호가 무엇인지 생각 나게하고 kill.

jobs 프로세스가 작업 번호 1임을보고합니다. kill 앞에 백분율 부호를 붙여야합니다 %.

jobs
kill %1

작업 및 터미널 창에서 % 1을 종료

kill 보낸다 SIGTERM 신호, 신호 번호 15를 프로세스에 전송하고 종료합니다. 다음에 Enter 키를 누르면 작업 상태가 표시됩니다. 프로세스를 “종료”로 나열합니다. 프로세스가 응답하지 않으면 kill 명령 당신은 그것을 한 단계 끌어 올릴 수 있습니다. 사용하다 killSIGKILL , 신호 번호 9입니다. kill 작업 번호를 명령하십시오.

kill 9 %1

우리가 다룬 것들

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

관련 : 리눅스 터미널에서 프로세스를 종료하는 방법