я начал
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
. Если древовидное представление слишком запутанно, вы также можете искать результаты следующим образом 1 :
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 %
top
чтобы завершить процесс, нажавk
, затем введя PID, а затем дважды нажав ввод.Это
&
заставит терминал создать новый процесс и заставить ваш код работать внутри него. Таким образом, ваш код становится независимым от терминального процесса. Даже если вы закроете терминал, новый процесс, в котором выполняется ваш код, не остановится. Так что или удали&
или сделайps -aux
, найдите свой процесс и убейте егоkill (process id)
.источник
Обычно bg для фона fg для переднего плана. Если вы используете & символ, используйте fg, он покажет текущую запущенную программу. Нажмите Ctrl + C, чтобы убить.
источник
bg
/fg
не будет работать после отсоединения терминалаbash
. Не сможет подключиться с помощью,reptyr
потому чтоbash
имеет дочерние процессы (sleep
).