루프가 백그라운드에서 실행되는 동안 bash를 중지하는 방법은 무엇입니까?


23

다음과 같이 while 루프를 시작했습니다.

while true; do {command}; sleep 180; done &

를 확인하십시오 &.

터미널을 죽였을 때이 루프가 멈출 것이라고 생각했습니다. 그러나 여전히 진행 중입니다. 터미널 세션을 종료 한 지 몇 시간이 지났습니다.

이 while 루프를 어떻게 중지합니까?

답변:


38

나는 시작했다

while true; do yad; sleep 60; done &

테스트하기 위해 터미널을 닫았습니다. 이제 같은 문제가 있습니다.

이미 터미널을 닫은 경우 루프를 시작했습니다

ps fjx내 컴퓨터의 마지막 줄 인으로 프로세스 실행에 대한 개요를 살펴 보겠습니다.

 2226 11606 11606 19337 ?           -1 S     1000   0:00  \_ /bin/bash
11606 22485 11606 19337 ?           -1 S     1000   0:00  |   \_ sleep 10
 2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
 9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad
    1  2215  2215  2215 ?           -1 Ss    1000   0:00 /lib/systemd/systemd --user
 2215  2216  2215  2215 ?           -1 S     1000   0:00  \_ (sd-pam)

yad의 하위 프로세스로 볼 수 있습니다. /bin/bash닫으면 출력에서로 yad변경됩니다 . 너무 다음과 같이 당신은 또한 출력을 검색 할 수 있습니다 혼란 트리 뷰의 경우 1 :sleep 60ps

ps fjx | grep "[y]ad"  # or respectively
ps fjx | grep "[s]leep 60"

출력 라인은 두 개의 숫자로 시작합니다. 첫 번째는 PPID, 상위 프로세스의 프로세스 ID이고 두 번째는 PID, 프로세스 자체의 ID입니다. 그것은 9411두 행에 모두 나타나기 때문입니다 .

2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad

이것이 bash우리가 죽이고 자 하는 서브 쉘이며 PID를 알게되었으므로 이제 남아있는 모든 것은 간단합니다

kill 9411  # replace 9411 with the PID you found out!

성가신 서브 쉘은 사라졌습니다.

1 : 같이 표기 grep "[y]ad"대신 단순히의이 grep yad방지 grep결과리스트에 표시되지 프로세스 자체.


터미널이 여전히 열려있는 경우

bash$!"가장 최근에 백그라운드에 배치 된 작업의 프로세스 ID로 확장" 변수를 제공 하므로 다음은 백그라운드에서 최신 프로세스를 종료합니다.

kill $!

최신 프로세스 가 아닌 경우 jobs기본 제공 예제 출력 으로 실행중인 작업 목록을 얻을 수 있습니다 .

[1]-  Running                 while true; do
    yad; sleep 60;
done &
[2]+  Stopped                 sleep 10

그 중 하나는 작업 번호 또는 바로 가기로 액세스 할 수 있습니다 죽이는 작업 목록에서 두 작업있다 %, %+( "현재 작업")와 %-백그라운드에서 실행 루프를 죽일 ( "이전 작업"), 예를 들어, 당신 할 수 있었다

kill %1  # or
kill %-

일시 중단 된 sleep 10작업 을 종료하려면

kill %2  # or
kill %+  # or
kill %

5

해당 명령을 입력 한 터미널을 닫을 때 하위 명령이 함께 종료되어야합니다. 이것을 재현하려고 시도했을 때이 동작이 나타났습니다.

이제 실제로 이러한 상황이 발생하지 않았다고 가정 &하면 명령의 끝 으로 인해 백그라운드에서 실행중인 프로그램을 종료하는 방법은 다음과 같습니다.

  1. 새 쉘을 열고 echo $$현재 PID (프로세스 ID)를 기록하여 자신의 세션을 종료하지 않도록 실행하십시오.
  2. 여전히 실행중인 프로그램의 PID를 식별하십시오. ps -ef | grep $SHELL명령을 사용하여 쉘을 실행중인 프로그램을 찾을 수 있습니다.
  3. 왼쪽에서 두 번째 열을 확인하고 위 의 결과 와 다른 숫자 값을 확인 하십시오 echo $$. 이것은 당신이 죽이고 싶은 PID입니다.
  4. 3 단계에서 식별 한 숫자 값이 있는 kill -SIGTERM <pid>명령을 실행하십시오.<pid>
  5. 2 단계를 반복하여 프로그램이 더 이상 실행되고 있지 않은지 확인

세션이나 컴퓨터를 다시 시작할 수도 있지만 위의 방법으로 컴퓨터를 피할 수 있습니다.


2
top을 누른 k다음 PID를 입력 한 다음 enter를 두 번 눌러 프로세스를 종료 할 수도 있습니다 .
— luk3yx

-1

는 &단말기가 새로운 프로세스를 만들고 그 안에 실행 코드를 얻을 수 있도록합니다. 따라서 코드는 터미널 프로세스와 독립적이됩니다. 터미널을 닫아도 코드가 실행중인 새로 프로세스가 중지되지 않습니다. 따라서 제거 &하거나 수행 ps -aux하고 프로세스를 찾아 종료하십시오 kill (process id).


-3

일반적으로 전경의 배경 fg의 경우 bg 입니다 . 당신이 사용하는 경우 및 기호 사용 FG는 현재 실행중인 프로그램을 표시합니다. 죽이려면 Ctrl + C 를 누르십시오 .


3
사용 bg/ fg단자에서 분리되면 작동하지 않습니다 bash. 사용하여 다시 연결 할 수없는 것 reptyr때문에 bash자식 프로세스가 ( sleep).
— xiota

그는 그 과정을 죽일 것이기 때문에 터미널을 닫았습니다. 다음에 그는 fg를 사용하여 프로그램을 닫습니다. 간단
— 호기심

다음 번에 궁금합니다. 그러나 영업 이익에 대해 요구하고 이 시간.
— RonJohn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.