Как остановить bash во время цикла в фоновом режиме?

Я запустил цикл while следующим образом:

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

Обратите внимание на &.

Я думал, что когда я убью терминал, этот цикл while прекратится. Но это все еще происходит. Прошло несколько часов с тех пор, как я убил терминальную сессию.

Как мне остановить этот цикл?

23
задан 10 May 2018 в 01:31

4 ответа

Я запустил

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 это изменяется на sleep 60 в выводе ps. Если структурный вид также смущает Вас, может также искать вывод как follows1:

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

Выходные строки начинаются с двух чисел, при этом первым является PPID, идентификатор процесса родительского процесса и второго, являющегося PID, идентификатором самого процесса. Это из-за этого 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 обеспечивает переменную $!, который “расширяется до идентификатора процесса задания, последний раз помещенного в фон”, таким образом, следующее просто уничтожает последний процесс в фоновом режиме:

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 %
38
ответ дан 23 November 2019 в 01:26

Я должен отметить, что при закрытии терминала, где Вы ввели ту команду, подкоманда должна была умереть наряду с нею. Попытка воспроизвести это показала это поведение.

Теперь, предположение, что Вы действительно находитесь в ситуации, где этого не произошло, один способ пойти о закрытии программы, Вы оставили выполнение в фоновом режиме, которое было вызвано & в конце команды, следующие:

  1. Откройте новую оболочку и работайте echo $$ отметить Ваш текущий PID (обрабатывают идентификатор), так, чтобы Вы не уничтожали свою собственную сессию.
  2. Определите PID программы, Вы думаете, все еще работает; можно сделать это использование ps -ef | grep $SHELL управляйте для нахождения, какие программы запускают оболочку.
  3. Отметьте 2-й столбец слева и отметьте числовое значение, которое отличается от Вашего echo $$ результат выше; это - PID, который Вы хотите уничтожить.
  4. Работайте kill -SIGTERM <pid> команда, где <pid> числовое значение, которое Вы определили на шаге № 3
  5. Подтвердите, что программа больше не работает путем повторения шага № 2

Вы могли также перезапустить свою сессию или свой компьютер, но вышеупомянутое позволит Вам избегать этого.

5
ответ дан 23 November 2019 в 01:26

& заставит терминал создать новый процесс и заставить Ваш код работать в нем. Таким образом, Ваш код становится независимым от терминального процесса. Даже если Вы закроете терминал недавно процесс, в котором работает Ваш код, то не остановится. Таким образом, любой удаляет & или сделайте ps -aux, найдите свой процесс и уничтожьте его kill (process id).

-1
ответ дан 23 November 2019 в 01:26

Обычно bg для фона fg для переднего плана. Если Вы используете, и символ используют fg, который он покажет текущей под управлением программе. Нажмите Ctrl+C для уничтожения.

-3
ответ дан 23 November 2019 в 01:26

Другие вопросы по тегам:

Похожие вопросы: