시작 및 종료 시 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