У меня есть сценарий, который я должен запускать с определенной частотой. Этот скрипт выполняет ряд программ в цикле, устанавливая некоторые переменные в каждом цикле. Поскольку этот сценарий выполняется часами, я запускаю его с помощью команды linux «at», doint
at now
>> ./myscript >> output
но время от времени мне приходилось убивать сценарий. Что я сделал, так это убил PID программ, которые он выполняет, ища их с помощью ps -A | grep 'имя'. Проблема здесь в том, что, поскольку есть цикл, я могу заниматься этим долгое время. 10 минут просто убивают процессы. Это неэффективно.
Как я могу найти PID скрипта, запущенного с «сейчас» несколько часов или дней назад? ps -A | grep 'bash' не дает никакого процесса bash, который работал бы так долго.
Я хочу убить скрипт, поэтому мне не нужно убивать весь процесс, запущенный циклом, пока он не завершится, но не могу найти PID.
fuser показывает PID процесса (ов), открывшего выходной файл.
Однако более элегантным решением является использование контрольных групп. Для этого вы можете использовать systemd. Просто создайте служебный файл для своего скрипта и запустите его с
systemctl start myscript.service
Если тебе нужно убить его
systemctl stop myscript.service
убивает скрипт и все созданные им процессы.
Я не понимаю что использовать at now
есть. Если вы просто хотите отделить процесс от терминала, используйте nohup или screen. Присвоение имени сеансу экрана также упростило бы удаление сценария.
Если у вас есть pgrep
и pkill
доступно это проще.
pgrep myscript.sh
даст вам pid (-а) myscript.sh. А -o
вариант даст вам самый старый pid.
pgrep -P $myscriptPid
для pid из приведенной выше команды вы получите всех дочерних элементов вашего родительского скрипта.
pkill
будут принимать те же параметры, но, как следует из названия ...
Если pgrep
недоступен, ps -ef | awk '/myscript.sh/ && !/ awk / { print $2 }'
принесет вам пид (ы)
ps -ef | awk -v pid=$myscriptPid '{ if ( $3 == pid ) { print $2 }'
получит детей вашего сценария.
Это не повторяется полностью вниз по дереву процессов до дочерних элементов, но должно быть достаточным
Процесс скрипта должен появиться с именем «myscript». Кроме того, вы можете найти одну из программ, которые она выполняет, и отследить PPID до тех пор, пока вам нужно.