Я часто использую 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
выводе, но ответы здесь более полезны.