Размер по/sys
Мне нравится этот вариант, так как он дает только одно значение:
cat /sys/module//coresize
Загрузить адрес наpr_debug
Если вы включите pr_debug
, эта информация присутствует, и это может быть полезно, если модуль паникует в init_module
.
Подробности на:Как получить адрес модуля ядра, который был вставлен с помощью insmod? | Переполнение стека
Вот подход, который не включает зацикливание и проверку того, жив ли еще другой процесс, или вызов 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
Вы можете запустить первый скрипт с помощью
python train_v1.py; touch finished
Затем просто создайте цикл, регулярно проверяющий, существует ли finished
:
while [ ! -f finished ] ; do
sleep 5
done
python train_v2.py
rm finished
Если вы уже запустили 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
Если сделать это таким образом, второй скрипт запустится независимо от статуса выхода первого скрипта. Использование &&
вместо ;
, как вы показываете в вопросе, также будет работать,но для запуска второго сценария потребуется успешное завершение первого сценария.
Если вы работаете в 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
не завершится.
Вы всегда можете простоwait
для работающей программы передать идентификатор программы в качестве параметра. PID можно получить из вызова ps
. Сделать его надежным в сценарии сложно, поэтому программы, которые предвидят, что кто-то хочет дождаться (или убить )их, обычно записывают свой собственный PID в известное место. Но для интерактивной ситуации, которую вы описываете, поиск PID и его копирование достаточно просты.
Если вам не нужно знать статус выхода первого сценария, то я рекомендую что-то вроде того, что написал Кусалананда .
Если вам необходимо знать статус выхода (, чего в данном случае вам, вероятно, не нужно, но кто-то другой может искать решение, которое делает это ), это сложнее. Я написал маленькую утилиту для Linux pwait
, которая позволяет дождаться завершения процесса и узнать статус его завершения.