Відповіді:
я розпочав
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 %
Мені потрібно зауважити, що коли ви закриваєте термінал, куди ви ввели цю команду, під команда повинна була загинути разом із нею. Спроба відтворити це показала таку поведінку.
Тепер, якщо припустити, що ви справді перебуваєте в ситуації, коли цього не сталося, один із способів вбити програму, яку ви залишили запускати у фоновому режимі, що було викликано &
в кінці команди, полягає в наступному:
echo $$
щоб помітити ваш поточний PID (ідентифікатор процесу), щоб ви не вбили власний сеанс.ps -ef | grep $SHELL
команди, щоб знайти, які програми мають оболонку.echo $$
результату вище; це PID, який ви хочете вбити.kill -SIGTERM <pid>
команду, де <pid>
є числове значення, яке ви визначили на кроці №3Ви також можете перезапустити сеанс чи комп’ютер, але вищесказане дозволить вам уникнути цього.
&
Змусить термінал створити новий процес і отримати код для запуску всередині нього. Таким чином ваш код стає незалежним від термінального процесу. Навіть якщо ви закриєте термінал, нещодавно процес, в якому працює ваш код, не зупиниться. Тож видаліть &
або зробіть ps -aux
, знайдіть процес і вбийте його kill (process id)
.
Зазвичай bg для фонового fg для переднього плану. Якщо ви використовуєте & symbol use fg, він відображатиме поточну запущену програму. Натисніть Ctrl + C, щоб вбити.
bg
/ fg
не працюватиме після від'єднання терміналу bash
. Не вдасться повторно встановити додаток, reptyr
оскільки bash
є дочірні процеси ( sleep
).
top
можете вбити процес, натиснувшиk
, потім ввівши PID, потім натисніть клавішу Enter двічі.