루프가 백그라운드에서 실행되는 동안 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.