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