시스템 서비스 활성화 시간 모니터링

시스템 서비스 활성화 시간 모니터링

oneshot서비스를 마지막으로 활성화하는 데 걸린 시간을 systemd에서 검색하고 싶습니다 . 나는 다음 옵션을 고려했지만 그다지 설득력이 없었습니다.

  1. 예를 들어 Compute는 InactiveEnterTimestamp - InactiveExitTimestampPython의 D-Bus 인터페이스를 통해 읽습니다. 이것의 단점은 서비스가 실행되는 동안 일관성이 없다는 것(=부정적)입니다.

  2. ExecStartPre및 의 도우미 스크립트를 사용하여 ExecStartPost타임스탬프를 저장하고 서비스 종료 이후 경과 시간을 계산합니다.

  3. 기본 실행 파일이 종료되면 파일 시스템 어딘가에 경과 시간을 저장하는 서비스 실행 파일 주위에 래퍼 스크립트를 사용합니다.

  4. 헬퍼 스크립트를 사용하여 ExecStartPost#1에서 계산된 값을 저장합니다.

가능하다면 4번을 선호하고, 그렇지 않다면 3번을 선호합니다. 어떤 제안이 있나요? 더 좋은 방법이 있나요?

배경: 나는 달리고 있다작은 RSS, 여기에는 시스템 타이머를 사용하여 주기적으로 실행하는 피드 업데이트 스크립트가 있습니다. 나도 달린다동기화같은 방법으로 Gmail 받은 편지함의 내용을 백업하세요. 나의 궁극적인 목표는 각 서비스가 활성화되는 데 걸리는 시간을 모니터링하고 서비스가 너무 오래 걸리거나 장기간 실행되지 않는 경우 경고를 발생시키는 것입니다.

편집: 내 서비스 파일은 다음과 같습니다.

[Unit]
Description=Tiny Tiny RSS feeds update
After=network.target mysqld.service postgresql.service

[Service]
Type=oneshot
ExecStart=/usr/bin/php /usr/share/webapps/tt-rss/update.php --feeds
User=ttrss
StandardOutput=syslog
StandardError=syslog

타이머는 다음과 같습니다.

[Unit]
Description=Tiny Tiny RSS feeds update timer

[Timer]
OnBootSec=1s
OnUnitInactiveSec=120s
Persistent=true
Unit=tt-rss.service

[Install]
WantedBy=timers.target

답변1

InactiveEnterTimestamp 계산 - InactiveExitTimestamp

활성화 시간(초)은 다음을 통해 계산됩니다.

(ActiveEnterTimestampMonotonic - InactiveExitTimestampMonotonic) / 1e6

analyze_plot파일의 함수 보기분석.c더 알아보기.

하지만 넌 그래야 해RemainAfterExit=yes귀하의 집에서 받으십시오 ActiveEnterTimestampMonotonic.

ExecMainExitTimestampMonotonic - ExecMainStartTimestampMonotonicPostStartExec없이 계산할 수 있습니다 RemainAfterExit.

예를 들어, Python의 D-Bus 인터페이스를 통해 읽어보세요.

systemctl다음을 사용하여 이러한 값을 추출 할 수 있습니다 .

$ systemctl show -p InactiveExitTimestampMonotonic -p ActiveEnterTimestampMonotonic unit
InactiveExitTimestampMonotonic=44364325621
ActiveEnterTimestampMonotonic=44369331083

~에 따르면인터페이스 안정성 약속:

The stable interfaces are:

...

The command line interface of systemctl, loginctl, journalctl.
We will make sure that scripts invoking these commands will continue
to work with future versions of systemd. Note however that the output
generated by these commands is generally not included in the promise,
unless it is documented in the man page. Example: the output of
"systemctl status" is not stable, but the one of "systemctl show" is,
because the former is intended to be human readable and the latter
computer readable, and this is documented in the man page.

나의 궁극적인 목표는 각 서비스가 활성화되는 데 걸리는 시간을 모니터링하고 너무 오래 걸릴 경우 경고를 보내는 것입니다.

설정할 수 있습니다시간 초과 시작 초그리고실패 시:

TimeoutStartSec= 

Configures the time to wait for start-up. If a daemon service does
not signal start-up completion within the configured time, the
service will be considered failed and will be shut down again.

OnFailure=

A space-separated list of one or more units that are activated when
this unit enters the "failed" state.

아니면 오랫동안 달리지 않았어

로그에서 마지막 성공 시간을 추출할 수 있습니다.

 journalctl -u your-service MESSAGE='Started your-service.service.'

하지만 넌 그래야 해~할 수 있게 하다로그 메시지의 지속적인 저장.

관련 정보