zfs 롤백이 완료될 때까지 systemd를 대기시키는 방법

zfs 롤백이 완료될 때까지 systemd를 대기시키는 방법

시작 및 종료 시 zfs 데이터 세트를 롤백하는 스크립트를 호출하는 시스템 서비스 파일을 작성하려고 합니다. 시작 부분은 잘 작동하지만 종료 중에 커널 패닉이 계속 발생합니다.

여기에 이미지 설명을 입력하세요.

zfs가 롤백을 완료하기 전에 systemd가 중요한 작업을 종료하고 있다고 생각합니다.

누구든지 어떤 제안이 있습니까? 이것은 내 현재 서비스 파일입니다.

[Unit]
Description=Public Rollback Service
After=zfs.target
Requires=zfs.target

[Service]
Type=oneshot
ExecStart=/bin/sh /usr/local/bin/public_rollback.sh
RemainAfterExit=True
ExecStop=/bin/sh /usr/local/bin/public_rollback.sh

[Install]
WantedBy=multi-user.target

호출되는 스크립트는 다음과 같습니다.

 #!/bin/sh

 if zfs rollback $(zfs list -H -o name -t snapshot -r tank/public | tail -1); then
     exit 0
 else
     echo "Could not rollback public dataset! Aborting." 1>&2
     exit 1
 fi

답변1

그래서 문제가 무엇인지에 대해 내가 틀린 것 같습니다. 로그를 확인한 후 데이터 세트가 아직 바쁜 상태에서 롤백을 시도했습니다(어쨌든 로그아웃 프로세스가 완료된 것으로 가정합니다).

롤백을 준비할 시간을 주기 위해 기본 ExecStop 명령 앞에 추가 명령을 추가했는데 ExecStop=/bin/sleep 1그 이후로는 문제가 발생하지 않았습니다.

답변2

두 가지 서비스를 사용할 수도 있습니다. 하나는 시작용이고 다른 하나는 종료용입니다. 시작을 위해 필요한 것 ExecStop(지침 제외) 다음과 같이 종료하기 전에 스크립트를 트리거하십시오.

[Unit]
Description=Public Rollback Shutdown Service
DefaultDependencies=no
Before=halt.target shutdown.target reboot.target

[Service]
Type=oneshot
ExecStart=/bin/sh /usr/local/bin/public_rollback.sh

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

관련 정보