Я запустил цикл while следующим образом:
while true; do {command}; sleep 180; done &
Обратите внимание на &
.
Я думал, что когда я убью терминал, этот цикл while прекратится. Но это все еще происходит. Прошло несколько часов с тех пор, как я убил терминальную сессию.
Как мне остановить этот цикл?
Я запустил
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 %
Я должен отметить, что при закрытии терминала, где Вы ввели ту команду, подкоманда должна была умереть наряду с нею. Попытка воспроизвести это показала это поведение.
Теперь, предположение, что Вы действительно находитесь в ситуации, где этого не произошло, один способ пойти о закрытии программы, Вы оставили выполнение в фоновом режиме, которое было вызвано &
в конце команды, следующие:
echo $$
отметить Ваш текущий PID (обрабатывают идентификатор), так, чтобы Вы не уничтожали свою собственную сессию.ps -ef | grep $SHELL
управляйте для нахождения, какие программы запускают оболочку.echo $$
результат выше; это - PID, который Вы хотите уничтожить.kill -SIGTERM <pid>
команда, где <pid>
числовое значение, которое Вы определили на шаге № 3Вы могли также перезапустить свою сессию или свой компьютер, но вышеупомянутое позволит Вам избегать этого.
&
заставит терминал создать новый процесс и заставить Ваш код работать в нем. Таким образом, Ваш код становится независимым от терминального процесса. Даже если Вы закроете терминал недавно процесс, в котором работает Ваш код, то не остановится. Таким образом, любой удаляет &
или сделайте ps -aux
, найдите свой процесс и уничтожьте его kill (process id)
.
Обычно bg для фона fg для переднего плана. Если Вы используете, и символ используют fg, который он покажет текущей под управлением программе. Нажмите Ctrl+C для уничтожения.