Завершение процесса cron и предотвращение его повторного запуска

  1. systemctl disable resolvconf.service
  2. systemctl stop resolvconf.service
  3. rm -f /etc/resolv.conf
  4. echo 'nameserver 8.8.8.8' > /etc/resolv.conf # или любой другой IP, который вы хотите использовать в качестве DNS сервера
  5. systemctl restart dnsmasq. service # только для тестирования
  6. cat /etc/resolv.conf # только для проверки

Машина не сможет получить адрес(ы) DNS сервера через DHCP, но это решает проблему.

1
23.08.2017, 04:00
3 ответа

Я думаю, вам может понадобиться что-то подобное :Как остановить цикл bash-скрипта в терминале?

Итак, в вашем случае, если вы используете SIGTERM вместо INT, так как в качестве задания cron я предполагаю, что вы пытаетесь убить его с помощью «kill» вместо ctrl+C:

jobstatus=0
trap "exit" SIGTERM
while [[ $jobstatus -lt 60 ]]
do
    sleep 5
    jobstatus=`getstatus whatever`
done

Должен разрешить уничтожение всего скрипта, а не только команд сна

Извините, что сделал это отдельным ответом, а не просто комментарием, но у меня пока недостаточно баллов, чтобы оставлять комментарии.

-1
27.01.2020, 23:45

Как упоминалось в комментарии Deathgrip, вы должны убить родительский процесс sleep, который вы можете найти с некоторыми вариациями ps | grep sleep(ps, имеет много реализаций, поэтому я не буду угадывать, какие именно флаги вам нужно предоставить или какие ваш вывод выглядит так. Проверитьman ps)

Что происходит? Когда вы убиваете sleep, он завершается, но это не влияет на выполнение содержащего скрипта... он просто переходит к следующей строке, и цикл продолжает повторяться. Есть несколько способов изменить скрипт, чтобы убить сон работало. Один из самых простых — сделать это:sleep 5 || exit.

В качестве альтернативы, если вы используете Bash (другие? ), вы можете просто добавить эту строку в начало :set -e. Это говорит Bash о завершении сценария, если какая-либо команда внутри завершается ошибкой (, т.е. возвращает не -нулевой статус ). Но это влияет на все в вашем сценарии и имеет ряд других ловушек, поэтому лучше избегать этого решения. (Вы можете добавить set -eв строку перед сном и отключить с помощью set +eсразу после него, но это становится несколько нелепым, поскольку вы можете просто использовать первое решение, о котором я упоминал.)

1
27.01.2020, 23:45

Если у вас на прицеле sleepпроцесс, и этот спящий процесс является частью сценария родительской оболочки, который выполняется в цикле, как у вас, то вам придется убить этот родительский процесс, чтобы предотвратить (конкретная команда )сна от повторного запуска.

Возьмите PID этого спящего процесса и найдите родительский процесс, затем уничтожьте его:

$ ps -e -opid,comm,args|grep sleep
424241 sleep  sleep 999 # for example
$ ps -oppid= -p SLEEP-PID-HERE-SUCH-AS-424241-ABOVE
424242 # for example
$ kill $(ps -oppid= -p SLEEP-PID-HERE-SUCH-AS-424241-ABOVE)
1
27.01.2020, 23:45

Теги

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