Запустите команду bash после завершения процесса.

Размер по/sys

Мне нравится этот вариант, так как он дает только одно значение:

cat /sys/module//coresize

Загрузить адрес наpr_debug

Если вы включите pr_debug, эта информация присутствует, и это может быть полезно, если модуль паникует в init_module.

Подробности на:Как получить адрес модуля ядра, который был вставлен с помощью insmod? | Переполнение стека

11
12.03.2020, 23:24
6 ответов

Вот подход, который не включает зацикливание и проверку того, жив ли еще другой процесс, или вызов train_v1.pyспособом, отличным от того, что вы обычно делаете:

$ python train_v1.py
^Z
[1]+  Stopped                 python train_v1.py
$ % && python train_v2.py

^Z— это нажатие Ctrl + Z во время перехода процесса в спящий режим train_v1.pyпутем отправки ему сигнала SIGTSTP. Затем я говорю оболочке разбудить ее с помощью %, используя ее как команду, к которой я могу добавить && python train_v2.pyв конце. Это заставляет его вести себя так, как если бы вы сделали python train_v1.py && python train_v2.pyс самого начала.

Вместо %вы также можете использовать fg. Это то же самое. Если вы хотите узнать больше об этих типах функций оболочки, вы можете прочитать о них в разделе «JOB CONTROL» страницы руководства bash .

РЕДАКТИРОВАТЬ :Как продолжать добавлять в очередь

Как указал jamesdlin в комментарии, если вы попытаетесь продолжить шаблон, чтобы добавить train_v3.py, например, до запуска v2, вы обнаружите, что не можете:

$ % && python train_v2.py
^Z
[1]+  Stopped                 python train_v1.py

Только train_v1.pyостанавливается, потому что train_v2.pyне запущен,и вы не можете остановить/приостановить/усыпить то, что даже не началось.

$ % && python train_v3.py

приведет к тому же результату, что и

python train_v1.py && python train_v3.py

, так как %соответствует последнему приостановленному процессу. Вместо того, чтобы пытаться добавить v3таким образом, следует вместо этого использовать историю:

$ !! && python train_v3.py
% && python train_v2.py && python train_v3.py

Можно выполнить расширение истории, как описано выше, или вызвать последнюю команду с привязкой клавиш (, например вверх ), и добавить v3 в конец.

$ % && python train_v2.py && python train_v3.py

Это то, что можно повторить, чтобы добавить больше в конвейер.

$ !! && python train_v3.py
% && python train_v2.py && python train_v3.py
^Z
[1]+  Stopped                 python train_v1.py
$ !! && python train_v4.py
% && python train_v2.py && python train_v3.py && python train_v4.py
29
28.04.2021, 23:20

Вы можете запустить первый скрипт с помощью

python train_v1.py; touch finished

Затем просто создайте цикл, регулярно проверяющий, существует ли finished:

while [ ! -f finished ] ; do     
    sleep 5
done
python train_v2.py
rm finished
6
28.04.2021, 23:20

Если вы уже запустили python train_v1.py, вы могли бы использовать pgrepдля опроса этого процесса, пока он не исчезнет, ​​а затем запустить второй скрипт Python:

while pgrep -u "$USER" -fx 'python train_v1.py' >/dev/null
do
    # sleep for a minute
    sleep 60
done
python train_v2.py

Используя -fи -x, вы сопоставляете точную командную строку, которая использовалась для запуска первого скрипта Python. В некоторых системах pgrepреализует параметр -q, который делает (тихим, как и grep -q), что означает, что перенаправление на /dev/nullне потребуется.

Параметр -uограничивает соответствие командам, которые вы выполняете (, а не другу или другому человеку в той же системе ).

Если вы еще не запустили первый скрипт:

Как упоминалось в комментариях, вы можете просто запустить второй скрипт сразу после первого скрипта. Тот факт, что второй скрипт не существует или еще не совсем готов к запуску, не имеет значения (, если он готов к запуску после завершения первого скрипта ):

.
python train_v1.py; python train_v2.py

Если сделать это таким образом, второй скрипт запустится независимо от статуса выхода первого скрипта. Использование &&вместо ;, как вы показываете в вопросе, также будет работать,но для запуска второго сценария потребуется успешное завершение первого сценария.

11
28.04.2021, 23:20

Если вы работаете в Linux (с bashдоступным ), это будет так же просто, как:

TL;DR :используйте это:

((python train_v1.py; kill $(cat./pid) && rm./pid) &

python train_v2.py & echo $! > pid

Более длинная версия:

Вы создаете вспомогательную оболочку -, в которой работает ваша обучающая версия V1 -, когда V1 завершается (независимо от кода возврата -, если вы хотите проверить наличие кода возврата 0, используйте &&вместо;)приложению kill предоставляется вывод файла с именем pid, и если kill завершается успешно, файл pidудаляется.

После этого вы запускаете второе обучение и записываете идентификатор процесса второго обучения в файл с именем pid, и там цикл закрывается. теперь обе обучающие программы работают в фоновом режиме, пока python train_v1.pyне завершится.

-1
28.04.2021, 23:20

Вы всегда можете простоwaitдля работающей программы передать идентификатор программы в качестве параметра. PID можно получить из вызова ps. Сделать его надежным в сценарии сложно, поэтому программы, которые предвидят, что кто-то хочет дождаться (или убить )их, обычно записывают свой собственный PID в известное место. Но для интерактивной ситуации, которую вы описываете, поиск PID и его копирование достаточно просты.

2
28.04.2021, 23:20

Если вам не нужно знать статус выхода первого сценария, то я рекомендую что-то вроде того, что написал Кусалананда .

Если вам необходимо знать статус выхода (, чего в данном случае вам, вероятно, не нужно, но кто-то другой может искать решение, которое делает это ), это сложнее. Я написал маленькую утилиту для Linux pwait, которая позволяет дождаться завершения процесса и узнать статус его завершения.

1
28.04.2021, 23:20

Теги

Похожие вопросы