У меня есть служба (написанная мной), работающая на сервере Debian (Jessie), и собственные журналы службы указывают, что она была перезапущена в определенное время. Нет никаких признаков сегфоута или другого сбоя, поэтому я сейчас пытаюсь выяснить, произошло ли какое- либо молчаливое завершение приложения и вызван ли он systemd, или же пользователь намеренно перезапустил сервис через него systemctl
.
История оболочки не показывает такую активность, но это не является окончательным из-за export HISTCONTROL=ignoreboth
и потому, что сеанс SSH мог просто истечь, что препятствовало записи истории bash предыдущего входа в систему на диск. Сервер не был перезагружен в то время.
Но я ожидаю, что сама systemd должна вести журнал, указывающий, когда служба была преднамеренно перезапущена. К моему удивлению, я не смог найти никакой документации (например, для journalctl
), как получить такие журналы.
Некоторые другие сообщения (например, Где / почему нет журнала для обычных пользовательских системных служб? ), Похоже, указывают, что должны быть сообщения журнала, подобные этому:
Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Starting chatty.service...
Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Started chatty.service.
Но я не вижу таких сообщений журнала в моей системе.
Есть ли способ узнать, когда системные службы были запущены, остановлены или перезапущены?
Редактировать : Кажется, типичная проблема, с которой люди могут столкнуться, заключается в том, что они работают journalctl
как непривилегированный пользователь. Это не так для меня, я работал root
все время. В ответ на комментарий, бег grep systemd /var/log/syslog
дает мне только это:
Jun 6 09:28:35 server systemd[22057]: Starting Paths.
Jun 6 09:28:35 server systemd[22057]: Reached target Paths.
Jun 6 09:28:35 server systemd[22057]: Starting Timers.
Jun 6 09:28:35 server systemd[22057]: Reached target Timers.
Jun 6 09:28:35 server systemd[22057]: Starting Sockets.
Jun 6 09:28:35 server systemd[22057]: Reached target Sockets.
Jun 6 09:28:35 server systemd[22057]: Starting Basic System.
Jun 6 09:28:35 server systemd[22057]: Reached target Basic System.
Jun 6 09:28:35 server systemd[22057]: Starting Default.
Jun 6 09:28:35 server systemd[22057]: Reached target Default.
Jun 6 09:28:35 server systemd[22057]: Startup finished in 59ms.
Jun 6 09:37:08 server systemd[1]: Reexecuting.
источник
grep systemd /var/log/syslog
Stopped target Default
иStarting Shutdown
т. Д. Ничего не указывает на отдельные услуги. Может быть, это просто проблема конфигурации? Заметьте, я в Debian Jessie в данном конкретном случае./etc/systemd/journald.conf
не переопределилиMaxLevelStore
илиMaxLevelSyslog
, и посмотрите во всех других местах, где вы можете настроить journald, как указано вman journald.conf
./etc/systemd
, по существу пусты (закомментированы все опции, включая те, что вы упомянули).Ответы:
Если вам нужно написать скрипт, вы должны изучить использование
systemctl show
команды. Это более полезно для сценариев, чем пытаться разобрать что-либо изstatus
. Например, чтобы узнать, когда сервис последний раз запускался, вы можете использовать:Если вы хотите увидеть все доступные свойства, просто опустите флаг, и он выведет их все.
Документацию по этим свойствам можно найти здесь .
источник
StatusErrno
иResult
? Я хотел бы знать, если эти изменения, если служба не удалось или был перезапущен. Если вам действительно нужно пойти дальше, попробуйте добавитьExecStopPost
шаг, где вы касаетесь файла и обновляете временную метку при завершении работы. Это поможет вам отличить тихий перезапуск от целенаправленных.При конфигурации по умолчанию в Debian непривилегированный пользователь не будет иметь доступа ни к журналам systemd-journald, ни к журналам syslog. Если вы вошли в систему как обычный пользователь, вы получите ответ от journalctl:
что немного сбивает с толку.
Если вы вошли в систему как root,
journalctl --unit=yourservice
должны предоставить вам информацию, которую вы ищете. После того, какsystemctl restart bind9
на моем сервере, я получаю это послеjournalctl --unit=bind9
:Если я убью bind9 явно с
kill -9
,journalctl --unit=bind9
дает:Первая строка указывает, что процесс умер, потому что он был убит.
systemd-journald также перенаправляет все сообщения журнала в системный журнал, поэтому вы также должны найти эти сообщения в
/var/log/syslog
.Systemd и systemd-journald по умолчанию скомпилированы в конфигурации, которую можно изменить в
/etc/systemd/system.conf
и/etc/systemd/journald.conf
.Может быть полезно знать, что по умолчанию systemd-journald хранит журналы в папке
/run
, котораяtmpfs
и, следовательно, исчезает после перезагрузки. Это означает, что для получения сообщений журнала старше, чем при последней загрузке, вам нужно будет просмотреть файлы системного журнала. В этом случае journalctl не выдаст вам журналы старше, чем при последней загрузке. Это можно изменить/etc/systemd/journald.conf
настройкойStorage=persistent
.Страницы руководства, которые документируют это:
Также обратите внимание, что для автоматического перезапуска службы systemd, это должно быть настроено в его
.service
файле. Отman 5 systemd.service
:источник
systemd
при выводе журнала , как вы описали, хотя я работал как корень все время./var/log/syslog
тоже ничего не показывает. Это systemd 215, кстати.Вы можете увидеть последний раз, когда ваша служба запущена или перезапущена. Используйте
service chatty status
илиsystemctl status chatty
. Вот примеры для службы apache2 или httpd:с
Active: active (running) since Wen. 2017-06-02 15:53:01 CEST; 21min ago
тех пор, как работает служба, но я не знаю, можете ли вы отобразить в виде «списка» именно то, что вы ищете.источник
service
старая команда Upstart, которая работает с systemd для совместимости Роднаяsystemd
команда естьsystemctl status apache2
.Мы можем использовать
-f
опцию для фильтрации сообщений из журнала ( https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html ).источник