다음 부팅 시 systemd 서비스 장치를 실행하지만 후속 부팅에서는 실행하지 않음

다음 부팅 시 systemd 서비스 장치를 실행하지만 후속 부팅에서는 실행하지 않음

다음에 시스템을 부팅할 때 실행하고 싶지만 후속 부팅에서는 실행하지 않으려는 스크립트가 있습니다. systemd를 사용하여 시작하고 싶었으므로 다음 위치에 서비스 파일을 만들었습니다 /usr/lib/systemd/system/myscript.service.

[Unit]
Description=My script.

[Service]
Type=oneshot
ExecStart=/opt/mypackage/bin/myscript

[Install]
WantedBy=multi-user.target

systemd에게 systemctl enable myscript.service.

후속 실행 시 실행을 중지하려면 어떻게 해야 합니까?

systemctl disable myscript.service스크립트 끝에 추가할 수 있지만 이렇게 하면 항상 서비스가 비활성화됩니다. 가능하다면 서비스를 활성화하고 시작한 후 다음 부팅 시 계속 실행하고 싶습니다.

답변1

ConditionPathExists=지시어(참조 systemd.unit(5))를 사용하여 조건부로 장치를 시작할 수 있습니다. 이를 통해 장치를 영구적으로 활성화하고 간단한 파일을 삭제하여 (일시적으로) 비활성화할 수 있습니다.

systemctl startsystemd에서는 "부팅 시 시작"과 "시작" 사이에 차이가 없습니다. 해결 방법은 스크립트에서 가동 시간을 확인하여 다음 부팅 시 장치를 활성화/비활성화할지 결정할 수 있도록 하는 것입니다(파일 삭제/생성 ConditionPathExists=).

답변2

참고: 이 답변은 확장됩니다.답변통과티모시 라벨 (티모시Siosm이라는 이름은 이전에도 이 사이트에서 사용되었습니다.) 대체 솔루션을 포함합니다. 첫 번째 부분에 동의하신다면 Timothée의 답변에 투표해 주세요.

그리고티모시 라벨의 답변, ConditionPathExists=단위 서비스 파일의 섹션에 사용됨(systemd.unit(5) 참조)[Unit]freedesktop.org에서또는man7.org에서) 서비스가 조건부로 실행되도록 합니다.

예를 들어, myscript파일이나 폴더를 한 번 생성하는 것이 사용자의 책임이라면 다음을 반영하는 시작 조건을 추가하세요 ConditionPathExists=!/path/to/folder. 참고하세요!, 이는 조건의 의미를 부정(반전)합니다. 경로가 존재하지 않는 경우에만 서비스 단위가 시작됩니다.

대신 스크립트가 성공적으로 실행된 후 삭제해야 하는 파일 ConditionPathExists과 같은 파일을 가리킬 수 있습니다 . /var/tmp/myscript.on-next-reboot단위 지시어로 삭제를 추가할 수도 있습니다 ExecStartPost=.


그러나 일반적으로 재부팅 후 작업이 필요하지 않도록 시스템이 제대로 작동하도록 노력해야 합니다. 다음 부팅 시 실행되도록 설정하는 방식은 매우 "Windows와 유사"합니다. Linux 사용자와 관리자는 결정적, 모듈식 및 예측 가능한 부팅을 선호합니다. 조건부 런타임 값이 다른 부팅 경로를 트리거하면 부팅 시스템을 추론하기가 더 어렵고 손상되기 쉽습니다.

관련 정보