일반화하다

일반화하다

일반화하다

비활성화된("정적") 시스템 서비스 단위로, 재부팅할 때마다 타이머에 의해 트리거되어 실행되어야 합니다.

배경

/etc/systemd/system/앞에 [Install]부서가 있었고 d였던 서비스 단위( )입니다 systemctl enable.

[Install]섹션은 제거되었으며 서비스가 비활성화되었습니다. 이제 서비스가 타이머에 의해 트리거됩니다. 타이머는 한 달에 한 번 실행되도록 설정되어 있으며 지속적이므로 마지막 실행을 추적하고 종료 시 실행을 놓친 경우를 제외하고 재부팅 시 실행되지 않습니다.

systemctl --system daemon-reload변경한 후 나는 달렸습니다.

타이머가 제대로 작동하고 예상대로 서비스를 트리거합니다.

질문

다시 시작하면 타이머가 마지막으로 실행된 시간과 타이머가 지속되는지 여부에 관계없이 서비스 단위가 항상 실행됩니다. ( 마지막 트리거 시간에 대한 출력이 잘못된 systemctl list-timers경우를 제외하고) 서비스 유닛을 트리거하는 것이 타이머 유닛이 아니라는 것을 확인(통과)했습니다 .list-timers

systemctl is-enabled <service-unit>표시됨 static(비활성화됨, [Install]셀에 섹션 없음)

find /etc/systemd/system/*.wants -name <service-unit>이 서비스의 이전 설치/활성화에서 남은 설치된 심볼릭 링크를 표시하지 마십시오.

재부팅 시 서비스가 시작되도록 하는 이 서비스 장치의 이전 설치에 일부 "레거시" 항목이 있는 것 같지만 어디를 봐야 할지 모르겠습니다.

이는 우분투 20.04에 있습니다(알려진 버그/문제가 있는 경우).

systemd가 유닛을 시작하는 이유를 디버깅하는 방법이 있습니까? (예를 들어 장치 X는 파일 Z의 Y가 필요하기 때문에 시작됩니다.)

서비스가 실제로 타이머에 의해 시작되지 않았는지(output에 의해 시작되는 대신 list-timers) 다시 확인하는 방법이 있습니까?

서비스 단위

# cat /etc/systemd/system/mysql_tzinfo.service
[Unit]
Description=mysql_tzinfo
Wants=mysql_tzinfo.timer

[Service]
Type=oneshot
Environment=
WorkingDirectory=/tmp
ExecStart=/bin/sh -c "/usr/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | /usr/bin/mysql --user=root mysql"

User=root
Group=root

타이머 장치

# cat /etc/systemd/system/mysql_tzinfo.timer
[Unit]
Description=Timer for mysql_tzinfo.service
Requires=mysql_tzinfo.service

[Timer]
Unit=mysql_tzinfo.service
OnCalendar=*-*-05 04:00:00
AccuracySec=30s
Persistent=true

[Install]
WantedBy=timers.target

답변1

Requires=mysql_tzinfo.service글쎄요, 이 글을 쓰는 동안 타이머 장치 섹션에 하나가 있다는 것을 알았습니다 .[Unit]

부팅 시 타이머 시작(systemd에 의한 종속성 해결)으로 인해 서비스가 시작될 수 있다는 생각이 들었습니다 Requires. 물론, 타이머에서 이 줄을 제거하고 다시 시작하면... 서비스가 더 이상 시작되지 않습니다. 이것은 내가 "기술 블로그"를 팔로우하고 모든 구성 옵션을 다시 확인하지 않을 때 얻는 내용입니다.

cron에서 systemd 타이머로 마이그레이션하려는 사람을 위한 핵심 사항 요약:

  • [Install]서비스 단위에 섹션을 추가하지 말고 , systemctl enable서비스 단위에 서비스 단위를 추가하지 마세요.
  • Requires=<SERVICE_NAME>.service타이머 장치에 a를 추가하지 마십시오 .
  • 타이머가 실행된 시간을 기억하고 시작 시 놓친 실행을 실행하도록 하려면 Persistent=true타이머에 추가하세요.
  • 타이머는 시작 시 상당히 일찍 실행되므로 After=필요한 모든 서비스(네트워크, 데이터베이스 등)가 온라인 상태가 될 때까지 서비스 단위가 실행되지 않도록 서비스 단위(타이머 단위가 실행되는 곳)에 필요한 요구 사항을 추가해야 합니다. 그렇지 않으면 실패할 가능성이 높습니다.

관련 정보