systemctl disable resolvconf.service
systemctl stop resolvconf.service
rm -f /etc/resolv.conf
echo 'nameserver 8.8.8.8' > /etc/resolv.conf # или любой другой IP, который вы хотите использовать в качестве DNS сервера
systemctl restart dnsmasq. service # только для тестирования
cat /etc/resolv.conf # только для проверки
Машина не сможет получить адрес(ы) DNS сервера через DHCP, но это решает проблему.
Я думаю, вам может понадобиться что-то подобное :Как остановить цикл bash-скрипта в терминале?
Итак, в вашем случае, если вы используете SIGTERM вместо INT, так как в качестве задания cron я предполагаю, что вы пытаетесь убить его с помощью «kill» вместо ctrl+C:
jobstatus=0
trap "exit" SIGTERM
while [[ $jobstatus -lt 60 ]]
do
sleep 5
jobstatus=`getstatus whatever`
done
Должен разрешить уничтожение всего скрипта, а не только команд сна
Извините, что сделал это отдельным ответом, а не просто комментарием, но у меня пока недостаточно баллов, чтобы оставлять комментарии.
Как упоминалось в комментарии Deathgrip, вы должны убить родительский процесс sleep
, который вы можете найти с некоторыми вариациями ps | grep sleep
(ps
, имеет много реализаций, поэтому я не буду угадывать, какие именно флаги вам нужно предоставить или какие ваш вывод выглядит так. Проверитьman ps
)
Что происходит? Когда вы убиваете sleep
, он завершается, но это не влияет на выполнение содержащего скрипта... он просто переходит к следующей строке, и цикл продолжает повторяться. Есть несколько способов изменить скрипт, чтобы убить сон работало. Один из самых простых — сделать это:sleep 5 || exit
.
В качестве альтернативы, если вы используете Bash (другие? ), вы можете просто добавить эту строку в начало :set -e
. Это говорит Bash о завершении сценария, если какая-либо команда внутри завершается ошибкой (, т.е. возвращает не -нулевой статус ). Но это влияет на все в вашем сценарии и имеет ряд других ловушек, поэтому лучше избегать этого решения. (Вы можете добавить set -e
в строку перед сном и отключить с помощью set +e
сразу после него, но это становится несколько нелепым, поскольку вы можете просто использовать первое решение, о котором я упоминал.)
Если у вас на прицеле 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)