시스템 서비스가 언제 시작 / 중지 / 다시 시작되었는지 어떻게 알 수 있습니까?


12

데비안 (Jessie) 서버에서 서비스 (자신이 작성)를 실행하고 있으며 서비스 자체 로그가 특정 시간에 다시 시작되었음을 나타냅니다. segfault 또는 기타 충돌에 대한 징후는 없으므로 이제 응용 프로그램이 자동으로 실패하고 systemd에 의해 다시 생성되는지 또는 사용자가를 통해 의도적으로 서비스를 다시 시작했는지 여부 를 파악하려고합니다 systemctl.

쉘 히스토리에는 이러한 활동이 표시되지 않지만 export HISTCONTROL=ignorebothSSH 세션이 시간 초과되어 이전 로그인의 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전체적으로 운영되었습니다 . 의견에 대한 답변으로 running 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
hschou

내 시스템에 난 단지 같은 매우 일반 메시지 참조 Stopped target Default, Starting Shutdown등 아무것도는 개별 서비스에 대해 아무것도 표시합니다. 어쩌면 구성 문제일까요? 참고이 특별한 경우에는 데비안 제시에 있습니다.
mindriot 2016 년

또는을 (를 ) /etc/systemd/journald.conf재정의하지 않았는지 확인 하고에 나열된대로 저널링을 구성 할 수있는 다른 모든 위치를 확인하십시오 . MaxLevelStoreMaxLevelSyslogman journald.conf
meuh

팁 고마워. 불행히도, unter에 /etc/systemd있는 모든 구성 파일 은 본질적으로 비어 있습니다 (앞서 언급 한 옵션을 포함하여 모든 옵션은 주석 처리되었습니다).
mindriot

답변:


11

이 스크립트를 작성해야하는 경우 systemctl show 명령 을 사용하여 조사해야합니다 . 에서 구문 분석을 시도하는 것보다 스크립트에 더 유용합니다 status. 예를 들어, 서비스가 마지막으로 시작된 시간을 찾으려면 다음을 사용할 수 있습니다.

$ systemctl show systemd-journald --property=ActiveEnterTimestamp
ActiveEnterTimestamp=Wed 2017-11-08 05:55:17 UTC

사용 가능한 모든 속성을 보려면 플래그를 생략하면 모두 제거됩니다.

$ systemctl show <service_name>

이러한 속성에 대한 설명서는 여기 에서 찾을 수 있습니다 .


흥미롭게도 나는 속성을 몰랐다. 불행히도 서비스가 실패하고 다시 생성되거나 사용자가 의도적으로 서비스를 다시 시작했는지 여부에 관계없이 동일하게 설정됩니다.
mindriot

1
그건 그렇고, 속성에 대한 더 나은 링크는 dbus documentation 인 것 같습니다 .
mindriot

문서에 대한 더 나은 링크 인 @mindriot에게 감사드립니다. 제 답변을 업데이트했습니다.
jdf

1
당신이 선택했다하더라도 @mindriot 첫 번째 포인트에 대한 StatusErrno그리고 Result? 서비스가 실패하거나 다시 시작되면 변경되는지 궁금합니다. 정말로 더 나아가 야 ExecStopPost할 경우 파일을 터치하고 종료시 타임 스탬프를 업데이트 하는 단계를 추가 하십시오. 이는 자동 재시작과 목적이있는 재시작을 구별하는 데 도움이됩니다.
jdf

고마워, 그것은 또한 좋은 지적이다. 상황을 쉽게 확인 / 재생할 수 없습니다. 내 원래 게시물은 이미 반년이되었으며 시스템에 약간의 변화가있었습니다. 그래도 어딘가에 시도해 볼 수 있는지 확인합니다 – 기회가된다면.
mindriot

3

데비안의 기본 설정으로, 권한이없는 사용자는 systemd-journald 또는 syslog 로그에 액세스 할 수 없습니다. 일반 사용자로 로그인 한 경우 journalctl에서이 응답을받습니다.

$ journalctl 
No journal files were found.

약간 혼란 스럽습니다.

루트로 로그인 한 경우 journalctl --unit=yourservice찾고있는 정보를 제공해야합니다. 후 systemctl restart bind9내 서버에, 난이 후 얻을 journalctl --unit=bind9:

Jun 03 18:20:24 ns systemd[1]: Stopping BIND Domain Name Server...
Jun 03 18:20:24 ns named[27605]: received control channel command 'stop'
Jun 03 18:20:24 ns systemd[1]: Starting BIND Domain Name Server...
Jun 03 18:20:24 ns systemd[1]: Started BIND Domain Name Server.

내가 명시 적으로 BIND9 죽일 경우 kill -9, journalctl --unit=bind9제공 :

Jun 03 18:46:25 ns systemd[1]: bind9.service: main process exited, code=killed, status=9/KILL
Jun 03 18:46:25 ns rndc[28028]: rndc: connect failed: 127.0.0.1#953: connection refused
Jun 03 18:46:25 ns systemd[1]: bind9.service: control process exited, code=exited status=1
Jun 03 18:46:25 ns systemd[1]: Unit bind9.service entered failed state.
Jun 03 18:46:25 ns systemd[1]: bind9.service holdoff time over, scheduling restart.
Jun 03 18:46:25 ns systemd[1]: Stopping BIND Domain Name Server...
Jun 03 18:46:25 ns systemd[1]: Starting BIND Domain Name Server...
Jun 03 18:46:25 ns systemd[1]: Started BIND Domain Name Server.

첫 번째 줄은 프로세스가 종료되어 프로세스가 종료되었음을 나타냅니다.

systemd-journald는 모든 로그 메시지를 syslog로 전달하므로이 메시지도에서 찾아야합니다 /var/log/syslog.

systemd 및 systemd-journald는 /etc/systemd/system.conf및 에서 변경할 수있는 구성으로 컴파일 된 기본값을 갖습니다 /etc/systemd/journald.conf.

기본적으로 systemd-journald는 기본적으로로 로그를 저장 하므로 재부팅 후 사라진다 /run는 것을 아는 것이 좋습니다 tmpfs. 즉, 마지막 부팅보다 오래된 로그 메시지를 얻으려면 syslog 파일을 봐야합니다. 이 경우 journalctl은 마지막 부팅보다 오래된 로그를 제공하지 않습니다. 이 /etc/systemd/journald.conf설정 은 에서 설정 하여 변경할 수 있습니다 Storage=persistent.

이것을 문서화하는 매뉴얼 페이지 :

man 8 systemd-journald
man 5 journald.conf
man 5 systemd-system.conf
man 5 systemd-user.conf

또한 systemd가 서비스를 자동으로 다시 시작하려면 .service파일 로 구성해야 합니다. 보낸 사람 man 5 systemd.service:

   Restart=
       Configures whether the service shall be
       restarted when the service process exits, is
       killed, or a timeout is reached. The service
       process may be the main service process, but it
       may also be one of the processes specified with
       ExecStartPre=, ExecStartPost=, ExecStop=,
       ExecStopPost=, or ExecReload=. When the death
       of the process is a result of systemd operation
       (e.g. service stop or restart), the service
       will not be restarted. Timeouts include missing
       the watchdog "keep-alive ping" deadline and a
       service start, reload, and stop operation
       timeouts.

       Takes one of no, on-success, on-failure,
       on-abnormal, on-watchdog, on-abort, or always.
       If set to no (the default), the service will
       not be restarted.

대부분의 사용자에게 문제를 해결할 수있는 광범위하고 잘 작성된 게시물에 감사드립니다 . 불행하게도, 내 경우에는 내가 보이지 않는 어떤 에 기인 로그 라인 systemdI 루트로 모든 시간을 일했다하더라도, 당신이 설명한대로 저널을 출력 할 때입니다. /var/log/syslog아무것도 표시하지 않습니다. 그건 그렇고 215 시스템입니다.
mindriot

3

서비스가 마지막으로 시작되거나 다시 시작된 시간을 볼 수 있습니다. service chatty status또는을 사용하십시오 systemctl status chatty. 다음은 apache2 또는 httpd 서비스의 예입니다.

# service apache2 status
● apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2)
  Drop-In: /lib/systemd/system/apache2.service.d
       └─forking.conf
   Active: active (running) since ven. 2017-06-02 15:53:01 CEST; 21min ago
  Process: 14773 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS)
  Process: 22912 ExecReload=/etc/init.d/apache2 reload (code=exited, status=0/SUCCESS)
  Process: 14880 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/apache2.service

Active: active (running) since Wen. 2017-06-02 15:53:01 CEST; 21min ago서비스가 실행되는 방식 이후 라인이 표시되지만 원하는 것을 '목록'처럼 표시 할 수 있는지 모르겠습니다.

# systemctl status httpd

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-10-11 00:35:58 EEST; 1 weeks 3 days ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 29728 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
 Main PID: 10722 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   Memory: 8.7M

1
service호환성을 위해 systemd와 함께 작동하는 이전 Upstart 명령입니다. 기본 systemd명령은 systemctl status apache2입니다.
Mark Stosberg

감사. 불행히도 그것은 서비스가 언제 (다시) 시작되었는지를 보여 주지만 왜 그런지 는 보여 주지 않습니다 . 또한 현재 상황, 즉 마지막 재시작 만 표시합니다 .
mindriot

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.