나는 한동안 cron을 사용해 왔으며 그 중 일부를 이해한 것 같습니다.결점, 그리고 이러한 문제를 해결하는 방법. 그들 중 하나결점예, cron은 시작 중에 다른 서비스의 상태를 인식하지 못합니다. 즉 @reboot
, 작업에 필요한 서비스를 아직 사용할 수 없는 경우 cron의 기능에 의해 예약된 작업에 문제가 발생할 수 있습니다. 내가 부를게예약 된 @reboot
일들.
하나해결책이 문제에 대한 해결책은 sleep
스크립트가 시작되기 전에 명령을 삽입하는 것입니다. 예를 들어 항목 @reboot
에서 다음과 같습니다.crontab
@reboot sleep 15; /path/to/script.sh
AFAIK, 이것은 문제를 처리하는 일반적인 방법입니다cron @reboot 문제
Systemd는 이 도구를 대체 @reboot
하고 초기화/시작 중에 사용자에게 더 나은 제어 기능을 제공한다고 합니다. 이 개선의 "비용"은 crontab
단일 라인을 단위 파일과 시스템 학습 곡선으로 대체하는 것입니다. 하지만 cron 서비스 자체는 systemd에서 시작되기 때문에( /lib/systemd/system/cron.service
내 Raspberry Pi를 통해)버스터OS), cron이 제거할 수 있는 것 같습니다.예약 된 @reboot
일들. 좀 그런거같아조정되지 않은sleep
systemd에서 사람들은 문제를 해결하기 위해 계속해서 해킹을 사용해야 합니다.예약 된 @reboot
일들.
난 아직 시스템 작업 중이야공로배지하지만 cron은 다음 중 하나여야 한다는 개념이 있습니다.마지막서비스가 초기화되었습니다. 제가 이렇게 말하는 이유는 cron이 시작 시 최종 서비스이기 때문입니다.주문하다,그럼 그 다음은이들 모두종속성또한 만족해야 하며 sleep
내 cron 작업 @reboot
의 해킹을 제거할 수 있습니다.
초기화 시퀀스가 끝날 때 또는 그 근처에서 cron을 시작하도록 systemd에 지시하는 방법을 이해하려고 노력하는 동안 저는 다음을 발견했습니다.cron.service
마지막 프로세스로 답변 지침을 시작할 수 있습니다.이것을 테스트하려면 다음 을 사용하십시오 Type=idle
./lib/systemd/system/cron.service
이전과 이후단위 파일의 버전은 cron.service
합리적인 접근 방식처럼 보입니다.
- 달리기
systemd-analyze plot > startup_order_noidle.svg
Type=idle
추가하다cron.service
- 재시작
- 달리기
systemd-analyze plot > startup_order_idle.svg
불행하게도 systemd 아래에 서비스 시작 순서를 나열하는 것은심오한운동.iaw 사용 systemd-analyze
이 기사는 답변을 제공하는 것 같습니다., 하지만 원하는 대로 작동하지 않습니다. cron.service
항상 나열되지는 않습니다. 설명하겠습니다.
이것.SVG파일 크기가 커서 공유할 수 없지만 목록 어디에도 표시 startup_order_noidle.svg
되지 않습니다 . cron.service
장미유,startup_order_idle.svg
했다cron.service
아래 줄에 표시됩니다 systemd-logind.service
. IoW, Type=idle
추가 되지 않으면 cron.service
시작되더라도 표시되지 않습니다.
도착하다검토: 다른 모든 서비스/장치/대상 등이 시작된 후 systemd에서 cron을 시작할 수 있는 안정적인 방법이 있습니까? 이를 확인할 수 있는 믿을 만한 방법이 있나요?
답변1
일반적으로 단위 파일의 경우 "After=" 및 "Requires=" 플래그를 지정해야 합니다. 일반적으로 서비스를 로드해야 하는 특정 "요구 사항"이 있기 때문입니다.
이 서비스를 마지막으로 로드하려면 현재 구성된 마지막 대상(multi-user.target 또는 graphic.target 등) 이후에 로드될 자체 대상을 생성하는 접근 방식을 권장합니다. ).
이 경우 새 서비스가 설치되면 일반적으로 다중 사용자와 같이 미리 구성된 대상으로 기본 설정되므로 어떤 변경 사항이 있어도 cron 서비스는 절대 마지막 서비스가 됩니다.
우연히도 연결한 질문에는 이를 수행하는 방법에 대한 전체 설명이 포함되어 있습니다.https://superuser.com/a/1543365
부팅 순서 확인과 관련하여 다음 명령을 사용할 수 있습니다.
systemctl list-units [-all] [--state=xxx]
*
상태:
- 비활성(선택사항)
- 활성화
- 실패
시작되지 않은(또는 실패한) 모든 서비스를 인쇄/기록하기 위한 cron 서비스의 사전 시작 exec의 일부로, 출력이 activating
비어 있는 경우(또는 cron 후에 시작해야 하는 서비스가 포함된 경우) 휴식할 수 있습니다. 확실히 크론은 실제로 가장 마지막으로 시작됩니다.
systemd-analyze plot
귀하의 사용 사례에서 신뢰할 수 없다고 주장하므로 이는 해결 방법입니다 .
* 다른 상태도 사용할 수 있습니다: active
, deactivating
, dead
, not-found
. 간략한 설명은 다른 소스와 함께 여기에서 찾을 수 있습니다.https://superuser.com/a/896951