나는 어려움을 겪었다이틀간단해야 하는 것을 작성하십시오. 즉, 컴퓨터가 종료되기 전에 실행되고 마운트된 파일 시스템과 상호 작용하는 일회성 시스템 서비스를 작성하십시오.
(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"는 내 서비스의 이름입니다.
이러한 명령을 사용하면 기호 링크가 추가되거나 제거됩니다.이러한 명령을 호출하지 않으면 테스트가 의미가 없습니다.