Я часто використовую bashсценарії оболонки для запуску простих команд для багатьох різних файлів. Наприклад, припустимо , що у мене є наступний bashскрипт, названий script.sh, який запускає команду / програми fooв трьох текстових файлів "a.txt", "b.txt", "c.txt":
#!/bin/bash
for strname in "a" "b" "c"
do
foo $strname".txt"
done
Припустимо також, що foo $strname".txt"це повільно, тому виконання сценарію займе багато часу (наприклад, години або дні). Через це я хотів би використовувати nohupтак, щоб виконання тривало, навіть якщо термінал закритий або відключений. Я також хотів би, щоб сценарій негайно перейшов на другий план, тому я буду використовувати &оператор. Таким чином, я буду використовувати наступну команду для виклику script.sh:
nohup bash script.sh &
Це чудово працює для запуску сценарію у фоновому режимі та без зависання, але тепер припустимо, що я хотів би чомусь припинити виконання в якийсь момент. Як я можу це зробити?
Проблема, з якою я стикався, полягає в тому, що, дивлячись top, я бачу лише fooвідповідне "a.txt". Я можу припинити цей fooвиклик, але тоді fooвідповідна "b.txt"дістається виклику, і тоді мені доведеться також припинити цей дзвінок тощо. Для десятків чи сотень текстових файлів, зазначених у forциклі, стає болем припиняти кожен foo, один за одним! Тож якимось чином потрібно замінити сам скрипт оболонки , а не конкретні дзвінки, що надходять із сценарію оболонки.
Коли я набираю команду
ps -u myusername
де myusernameмоє ім’я користувача, я отримую список процесів, які я запускаю. Але я бачу два різних ідентифікатори процесу, які називаються bash. Як я можу знати, який із цих процесів, якщо такий є, відповідає моєму початковому дзвінку nohup bash script.sh &?
for s in a b c; do foo "$s".txt; done
nohupдавно піде час, коли ви відкриєте список процесів, щоб побачити роботу, яку ви почали. Ви можете подивитися у стовпці "приємність" у psвисновку, але відповіді тут корисніші.