Я часто використовую 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
висновку, але відповіді тут корисніші.