종료하기 전에 마운트된 파일 시스템의 systemd 서비스를 실행하고 사용하십시오.

종료하기 전에 마운트된 파일 시스템의 systemd 서비스를 실행하고 사용하십시오.

나는 어려움을 겪었다이틀간단해야 하는 것을 작성하십시오. 즉, 컴퓨터가 종료되기 전에 실행되고 마운트된 파일 시스템과 상호 작용하는 일회성 시스템 서비스를 작성하십시오.

(RAM에 "~/.mozilla" 디렉터리를 마운트해 놓았고, 컴퓨터 종료 시 하드 드라이브에 변경 사항을 저장하려고 합니다.)

나는 태양 아래에서 모든 것을 시도했지만 아무것도 작동하지 않습니다. 최선의 시도는 다음과 같습니다.

[Unit]
Description=Save Firefox and Thunderbird to the hard drive
DefaultDependencies=no
BindsTo=home-andy-.mozilla.mount
After=home-andy-.mozilla.mount
Before=halt.target poweroff.target reboot.target shutdown.target
Conflicts=umount.target

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/mozilla-save
TimeoutStartSec=infinity

[Install]
WantedBy=halt.target poweroff.target reboot.target shutdown.target

다음은 각 문을 추가한 이유에 대한 설명입니다.

[Unit]
Before=halt.target poweroff.target reboot.target shutdown.target

[Install]
WantedBy=halt.target poweroff.target reboot.target shutdown.target

내 스크립트는 컴퓨터가 꺼졌을 때 실행되어야 하기 때문에 이것을 추가하는 것입니다. 이들 중 어느 하나가 다른 모든 것을 의미하는지, 아니면 모두 지정해야 하는지는 확실하지 않습니다. "[설치]" 섹션에 이미 해당 정보가 포함되어 있는 것 같기 때문에 "이전" 문이 절대적으로 필요한지 여부도 명확하지 않습니다.

또한 "umount.target"과 관련된 변형을 시도했습니다.

[Unit]
DefaultDependencies=no

[Service]
TimeoutStartSec=infinity

이는 잠재적으로 오래 실행되는 프로세스가 몇 분 후에 공격적인 종료 프로세스로 인해 종료되는 것을 방지하기 위한 것입니다.

[Unit]
BindsTo=home-andy-.mozilla.mount
After=home-andy-.mozilla.mount
Conflicts=umount.target

내 프로세스가 tmpfs 파일 시스템("/home/andy/.mozilla"에 마운트됨)에 의존하기 때문에 이것을 추가합니다. 프로세스가 시작될 때 파일 시스템을 마운트해야 합니다.설치된 상태로 유지되어야 합니다내 프로세스가 완료될 때까지. 종료 프로세스는 파일 시스템 마운트 해제를 포함하여 많은 작업을 병렬로 실행합니다.

다른 사람들의 이익을 위해: "/etc/fstab" 파일에서 마운트 지점을 선언하면 자동으로 systemd에서 사용할 수 있습니다. 필요할 수 있는 다양한 장착 지점을 나열하는 방법은 다음과 같습니다.

systemctl list-units --type=mount

이것이 내가 지금 있는 곳이다. 나는 이것에 대해 며칠을 보냈고 지쳤습니다. 나는 systemd에 지쳤고 도움이 필요합니다. 부스러기라도 무엇이든 감사합니다.

기록에 따르면, 현재 파일 시스템이 읽기 전용으로 다시 마운트되었기 때문에 "/lib/systemd/system-shutdown/mozilla-save"의 설치 스크립트는 작동하지 않습니다.

이것도 작동하지 않습니다.

Unit]
Description=Save Firefox and Thunderbird to the hard drive
BindsTo=home-andy-.mozilla.mount home.mount
After=home-andy-.mozilla.mount home.mount
Conflicts=umount.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/local/sbin/mozilla-stop

[Install]
WantedBy=multi-user.target

...왜인지는 모르겠지만.

답변1

작동하는 서비스는 다음과 같습니다.

[Unit]
Description=Save Firefox and Thunderbird to the hard drive
RequiresMountsFor=/home /home/andy/.mozilla

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/local/sbin/mozilla-save
TimeoutSec=infinity

[Install]
WantedBy=multi-user.target

경쟁 조건을 확인하기 위해 백업 스크립트 시작 부분에 300초 절전 모드를 추가했습니다. 종료 프로세스가 300초 동안 지연된 후 백업 스크립트가 성공적으로 실행됩니다.

이것이 마침내 작동하는 구성입니다. 이 솔루션이 다른 사람들에게 도움이 되기를 바랍니다.

이것이 작동하는 이유에 대한 내 추측은 다음과 같습니다.

나는 믿는다

[Service]
Type=oneshot
ExecStart=/bin/true

[Install]
WantedBy=multi-user.target

...다중 사용자 실행 수준이 시작될 때 "/bin/true"가 실행됩니다.

이 자체로는 아무 것도 수행되지 않습니다. 그러나 다음과 같이 선언하십시오.

[Service]
RemainAfterExit=true

...systemd가 "/bin/true"라고 생각하게 만듭니다.아직도 달리고 있다다중 사용자 런레벨이 끝나면(즉, 종료하기 전에 모든 것을 해체합니다).

이 시점에서 systemd는 ExecStop을 호출하여 "/bin/true" 프로세스를 종료합니다.

ExecStop=/usr/local/sbin/mozilla-save

...내 백업 스크립트 실행대신에.

이제 일반적으로 systemd는 장기 실행 ExecStop 프로세스를 종료하므로 백업 스크립트를 완료하는 데 충분한 시간을 주어야 합니다.

TimeoutSec=infinity

그리고 systemd는 다른 모든 것을 동시에 종료하므로 백업 프로세스 중에 파일 시스템을 마운트하고 쓰기 가능한 상태로 유지하는 데 필요합니다.

[Unit]
RequiresMountsFor=/home /home/andy/.mozilla

간결하고 읽기 쉬운 설명입니다.체계그리고유닛 파일디지털 바다에서. 이건 완전해기술 문서필요한 경우.

참고: 서비스의 "[설치]" 부분을 변경하면~ 해야 하다systemctl에 변경 사항을 알립니다. 이것이 내가 하는 방법이다:

systemctl disable mozilla-save
systemctl enable mozilla-save

...여기서 "/lib/systemd/system/모질라 저장.service"는 내 서비스의 이름입니다.

이러한 명령을 사용하면 기호 링크가 추가되거나 제거됩니다.이러한 명령을 호출하지 않으면 테스트가 의미가 없습니다.

관련 정보