Назад | Перейти на главную страницу

убить выполнение скрипта

У меня есть сценарий, который я должен запускать с определенной частотой. Этот скрипт выполняет ряд программ в цикле, устанавливая некоторые переменные в каждом цикле. Поскольку этот сценарий выполняется часами, я запускаю его с помощью команды 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 до тех пор, пока вам нужно.