Как перезапустить зависший процесс?
Задача: Консольная прога непрерывно выводит результаты своей работы. Раз в N сек среди разных других строк должно появляться определенное сообщение. (В этой строке появляется слово, которого не бывает в других.) Если оно не появилось (а другие строки сыпятся) — надо перезапустить прогу. Исходники слишком громоздкие для меня, слишком долго буду разбираться. Можно ли это сделать на bash или надо что-то мощнее? perl, например? 20 лет назад ковырялся в freefsd, но все уже стерлось в памяти. Поможете. Буду крайне признателен.
mk900
18.10.16 02:32:19 MSK
$ kill
$ killall
Если упорное и не прибивается, тогда можно пожёсче:
$ kill -9
$ killall -9
Но второе не очень рекомендуется.
Kroz ★★★★★
( 18.10.16 02:51:30 MSK )
Последнее исправление: Kroz 18.10.16 02:53:20 MSK (всего исправлений: 1)
my $pid = 1234; my $timer = 0; my $logfile = '/path/to/logfile'; open my $LOGFILE, '; last unless defined $line; # EOF if ($line =~ /word/) < $timer = 0; next; >$timer++; if ($timer > $limit) < kill 'TERM', $pid; # запустить процесс обратно, получить его pid $timer = 0; >>
anonymous
( 18.10.16 03:40:12 MSK )
Послать надо SIGHUP Сигнал SIGHUP (номер 1) изначально был предназначен для того, чтобы информировать программу о потере связи с управляющим терминалом (терминалы часто подключались к системе с помощью модемов, так что название сигнала происходит от hung up – повесить трубку). Сигнал SIGHUP посылается приложению так же и в том случае, если процесс-лидер сессии завершил свою работу. Многие программы-демоны, у которых нет лидера сессии, так же обрабатывают этот сигнал. В ответ на получение SIGHUP демон обычно перезапускается (или просто повторно читает файл конфигурации). По умолчанию программа, получившая этот сигнал, завершается.
Смотри man kill Killall [имя программы] -HUP
sova ★★
( 18.10.16 09:49:21 MSK )
Ответ на: комментарий от sova 18.10.16 09:49:21 MSK
По умолчанию программа, получившая этот сигнал, завершается.
Хм. Вот честно, ни разу не встречал такого поведения. В худшем случае не реагируют никак, в лучшем — перечитывают конфигурацию и продолжают работать.
Black_Shadow ★★★★★
( 18.10.16 10:15:27 MSK )
Ответ на: комментарий от Black_Shadow 18.10.16 10:15:27 MSK
По умолчанию программа, получившая сигнал [HUP], завершается.
Хм. Вот честно, ни разу не встречал такого поведения.
Очень странно. Тут даже не поймешь, какой пример лучше привести — они почти все себя так ведут: bash(1), emacs(1), cp(1) и так далее.
В худшем случае не реагируют никак
unixforum.org
перезапуск процесса с аргументами (kill -1)
Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.
Модератор: Bizdelnick
3 сообщения • Страница 1 из 1
GaIEoAUatIC Сообщения: 53 ОС: luntu
перезапуск процесса с аргументами
Сообщение GaIEoAUatIC » 08.04.2011 20:47
Доброго времени суток
Хотел бы узнать как можно через команду kill -1 «pid сервака» перезапускать процесс?
если подать команду kill -1 «pid сервака» — то он перезагрузит конфиг
Но при подаче этой команды kill -1 «pid сервака» у меня полнастью вылетает весь процесс из памяти почему?
Спасибо сказали:
drBatty Сообщения: 8735 Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит. ОС: Slackware-current Контактная информация:
Re: перезапуск процесса с аргументами
Сообщение drBatty » 08.04.2011 21:19
GaIEoAUatIC
1) скрипт нечитаем, ибо не отформатирован
2) & не работает так просто в скрипте. используйте ( ./script & )
Скоро придёт
Осень
Спасибо сказали:
sash-kan Администратор Сообщения: 13939 Статус: oel ngati kameie ОС: GNU Контактная информация:
Re: перезапуск процесса с аргументами
Сообщение sash-kan » 09.04.2011 14:04
08.04.2011 20:47
Хотел бы узнать как можно через команду kill -1 «pid сервака» перезапускать процесс?
программа kill предназначена для передачи сигналов процессам. перезапускать их она не умеет.
08.04.2011 20:47
если подать команду kill -1 «pid сервака» — то он перезагрузит конфиг
1 — это сигнал hup (см. man kill). это перехватываемый сигнал. будет ли демон его перехватывать (или просто завершит работу) и какие действия при этом произведёт — зависит от того, что там его разработчики придумали. довольно часто разработчики реализуют перепрочтение конфигурационных файлов при получении демоном этого сигнала.
обычный путь перезапуска демона — вызвать его старт-стоповый скрипт с параметром restart.
старт-стоповые скрипты обычно находятся в /etc/init.d.
пример для демона cron.
у меня в системе старт-стоповый скрипт носит то же имя (это, кстати, вовсе не обязательно):
$ sudo /etc/init.d/cron restart
Restarting periodic command scheduler: cron.
Писать безграмотно — значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Как перезагрузить сервер Linux: пошаговая инструкция
В этой статье мы рассмотрим, как перезагрузить сервер Linux. Информация будет полезная для начинающих пользователей, которые только знакомятся с данной операционной системой.
Начнём с главного правила – перезагрузка линукс должна выполняться только при крайней необходимости! Кроме того, нельзя этого делать в процессе установки или удаления программ.
Когда может потребоваться перезагрузка сервера Linux
Почему же нужна весомая причина для перезапуска системы? Дело в том, что может нарушить работу серверного оборудования, привести к ошибкам и сбоям. Поэтому условно выделяют 5 ситуаций, когда в этом есть необходимость.
- Зависание сервера. Например, если он не выполняет своих задач или сильно тормозит.
- Неправильно работают программы.
- Вы сменили операционную систему, в таких случаях всегда требуется перезагрузка линукс перед началом работы.
- Вы работаете с BIOS. При этом неважно, если ли у вас физический доступ или вы запустили эмуляцию.
- Запущена программа низкоуровневого копирования и восстановления данных.
В остальных случаях сначала нужно попытаться решить проблему другим способом.
Как перезагрузить Linux в графическом интерфейсе
Это самый простой способ, интуитивно понятный и привычный всем пользователям компьютеров с различными операционными системами.
В ubuntu перезагрузка выполняется нажатием на значок шестерёнки в правом верхнем углу. После этого появится меню, где нужно выбрать пункт «Выключение». Затем система выдаст ещё одно окно. Здесь нужно кликнуть по левому пункту «Перезагрузить».
В других дистрибутивах в главном меню нужно кликнуть на вкладку «Выход», а затем выбрать пункт «Перезагрузка».
Как перезапустить сервер удалённо
Многие IT-специалисты управляют серверами удалённо с помощью специальных программ. В них предусмотрены команды, которые запускают перезагрузку без необходимости лично находиться возле устройства.
Команду, которая подходит именно вам, можно посмотреть в инструкции, прилагающейся к программе удалённого доступа. Обычно используется такая команда.
ssh root@remote-server.com /sbin/reboot.
Как перезагрузить линукс через терминал
Существует несколько способов, среди которых можете выбрать тот, который кажется вам проще.
Наиболее популярная команда для linux «reboot»
Символ $ говорит о том, что для её ввода нужны права суперпользователя. Зато после ввода команды останется только нажать Enter.
Также часто используется команда перезагрузки linux «shutdown», которая характеризуется расширенным функционалом. Утилите нужно задать параметр -r и можно задать время.
shutdown -r now (Перезагрузить сейчас).
shutdown -r 12:00 (Выполнить перезагрузку в полдень).
shutdown -r +10 (Перезагрузить систему через 10 минут)
Следом система выдаст информацию о задании. Например, она будет выглядеть так, если задать время перезагрузки 1 минуту.
Чтобы отменить команду, нужно ввести shutdown -c, как указано в выделенной строке.
В системах инициализации совместимых с Init Scripts предусмотрено 6 уровне загрузки системы. 0 означает включение, а 6 – перезагрузку. Переключение между ними задаётся с помощью команды «init». А для её использования тоже нужны права суперпользователя.
Как перезагрузить линукс через службу системных сообщений D-Bus
Выше мы рассмотрели команды, для введения которых необходим статус суперпользователя. Но как перезагрузить сервер через командную строку, если его нет?
Для этого в Linux предусмотрена встроенная утилита, которая обеспечивает взаимодействие программ друг с другом. Называется она D-Bus.
То есть обычные пользователи тоже могут ввести команду и отправить сервер на перезагрузку. Но эта команда довольно длинная.
/usr/bin/dbus-send —system —print-reply —
Этот способ актуален, если графическая оболочка не отвечает. При этом настройка выполняется через консоль. Процесс состоит из нескольких шагов.
- Запускаем терминал и вводим команду.
echo 1 > /proc/sys/kernel/sysrq
- В текстовом редакторе открываем конфигурационный файл. Например так.
sudo nano /etc/sysctl.conf
- Вводим пароль суперпользователя.
- В самом конце файла добавляем ещё одну строчку.
- Нажимаем «Записать» для сохранения изменений и «Выход».
- Зажимаем одновременно клавиши Alt + SysRq + Код клавиши.
R — возвращает управление клавиатурой.
E — отправка сигнала SIGTERM всем процессам кроме init.
I – отправка сигнала SIGKILL всем процессам кроме init.
S – синхронизация файловых систем, информация сохраняется на жёстком диске.
U – монтаж файлов в режим только чтение;
B – запуск перезагрузки без учёта предупреждений.
Нужно нажать все 6 комбинаций в последовательности R E I S U B с интервалом приблизительно в секунду. Если перезагрузка требуется срочно, достаточно нажать комбинацию Alt + SysRq + B. Но в этом случае есть риск повреждения файловой системы и потери данных.
Кроме того, можно использовать только клавишу SysRq. Для этого предварительно нужно записать в файл /proc/sysrq-trigger код операции.
echo b > /proc/sysrq-trigger
Как выполнить перезагрузку в Recovery Mode
Recovery Mode – это режим восстановления.
В консоли выберите пункт «Продолжить нормальную загрузку», чтобы запустить загрузку операционной системы в обычном режиме.
Также можете выбрать «Перейти в командный интерпретатор суперпользователя». В этом случае откроется консоль в root. Для выбора нажмите клавишу «Enter».
Теперь введите команду «reboot», чтобы начать перезагрузку.
Что делать, если сервер не работает после перезагрузки
Если перезагрузить сервер не удалось, подключитесь через IP-KVM (консоль к выделенному серверу), чтобы посмотреть его состояние, или обратитесь в техподдержку.
Заключение
Теперь вы знаете, как перезагрузить ubuntu через терминал или другим способом. Эта информация поможет в случаях, если система зависла.
Но мы не рекомендуем все проблемы решать перезагрузкой. Для начала убедитесь, что она необходима. А при возникновении вопросов обращайтесь в техподдержку.
Автоматический перезапуск сервиса Linux
Иногда сервисы ни с того ни с сего падают и приходиться их вручную восстанавливать. Если для пользователя домашнего компьютера это не критично, потому что если сервис падает во время разработки, то это даже хорошо, можно сразу увидеть что есть проблема. Но на серверах и VPS сервисы должны работать постоянно для обеспечения доступа к веб-сайту или приложению.
В этой инструкции я покажу как настроить автоматический перезапуск сервиса Linux несколькими способами: с помощью скрипта мониторинга периодически запускаемого через cron и в systemd.
Автоматический перезапуск сервиса в systemd
По умолчанию, если ваш сервис будет убит или завершится некорректно, systemd не будет с ним ничего делать. Но можно настроить сервис так, чтобы при падении или даже остановке он автоматически перезапускался. Для этого используется директива Restart, которую надо добавить в секцию Service. Этот параметр может иметь такие значения:
- on-failure — только если произошла ошибка;
- on-success — только если процесс сервиса завершился без ошибок;
- on-abnormal — только если сервис не отвечает;
- always — перезапускать всегда, когда сервис был остановлен;
Например, рассмотрим настройку автоматического перезапуска сервиса Apache:
sudo systemctl edit apache2 [Service]
Restart=on-failure
RestartSec=5s
Директива RestartSec указывает сколько ждать перед перезапуском сервиса. Когда завершите сохраните изменения и выполните команду daemon-reload, чтобы перечитать конфигурацию:
sudo systemctl daemon-reload
Затем чтобы проверить что всё работает посмотрите состояние процесса, завершите процесс сигналом kill:
sudo systemctl status apache2 kill -KILL 32091
И снова посмотрите состояние. Процесс будет запущен. Система инициализации автоматически перезапустит его как только он завершится с кодом возврата ошибки. Если вы хотите чтобы процесс перезапускался всегда, необходимо использовать директиву Restart: always. Однако с ней надо быть осторожным, она вовсе не даст вам завершить процесс, даже если будет необходимо. Для того, чтобы процесс, который постоянно падает не перезапускался, можно добавить лимит на количество перезапусков в секцию Service:
sudo systemctl edit apache2 [Service]
StartLimitIntervalSec=500
StartLimitBurst=5
Restart=on-failure
RestartSec=5s
Директивы StartLimitBurst и StartLimitIntervalSec указывают, что надо попытаться перезапустить сервис пять раз, и если он все эти пять раз упадёт, то больше его не трогать. Вторая директива ограничивает время перезапусков сервиса до 500 секунд.
Автоматический перезапуск сервиса с помощью скрипта
Это самый простой и самый надежный способ работающий абсолютно во всех дистрибутивах Linux и не требующий установки дополнительных утилит. Для того же Apache скрипт выглядит следующим образом:
sudo vi /usr/local/bin/apache-monitor.sh #!/bin/bash
ps -A | grep apache2 || systemctl start apache2
Сохраните файл, сделайте его исполняемым:
chmod ugo+x /usr/local/bin/apache-monitor.sh
Теперь добавьте запись в cron для периодического запуска скрипта:
sudo crontab -e */5 * * * * /usr/local/bin/apache-monitor.sh
На этом все, автоматический перезапуск сервисов штука может и немного сложная, но необходимая в серьезных системах.