systemd로 종료시 다른 모든 것보다 먼저 스크립트를 실행하는 방법


17

참고 : 간략한 공식 질문은 하단에 있습니다.

파일을 외부 USB 드라이브에 백업하는 스크립트가 있습니다. 내가 만든 새 데이터의 양에 따라 실행하는 데 시간이 걸릴 수 있습니다. 시스템을 종료 할 때마다 자동으로 실행하고 싶습니다.

최신 업데이트 (systemd)와 함께 fedora 23을 사용하고 있습니다.

나는 여러 가지 방법으로 이것을 달성하려고 노력했지만 그것을 작동시키지 못했습니다.

StopExec을 통한 장기 실행 프로세스

자동 백업 서비스 :

[Unit]
Description=Slow backup script
Requires=local-fs.target

[Service]
ExecStart=/bin/true
ExecStop=/etc/systemd/system/do_backup.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multiuser.target

로 활성화하고로 systemctl enable autobackup.service시작했습니다 systemctl start autobackup.service.

부팅 로그의 일부 ( journalctl -b-1) :

Dez 22 17:45:27 localhost systemd[1]: Unmounted /mnt/BACKUP.
Dez 22 17:45:27 localhost do_backup.sh[4296]: At subvol /home/BACKUP.2015_12_22-17_45_25
Dez 22 17:45:27 localhost do_backup.sh[4296]: ERROR: parent subvol is not reachable from inside the root subvol.
Dez 22 17:45:27 localhost do_backup.sh[4296]: At snapshot BACKUP.2015_12_22-17_45_25
Dez 22 17:45:27 localhost do_backup.sh[4296]: ERROR: failed to dump stream. Broken pipe
Dez 22 17:45:27 localhost systemd[1]: autobackup.service: Control process exited, code=exited status=1
Dez 22 17:45:27 localhost systemd[1]: Stopped Slow backup script.
Dez 22 17:45:27 localhost systemd[1]: autobackup.service: Unit entered failed state.

나는 그 사이에 아무것도 줄지 않았으며, 스크립트가 시작되기 직전에 / mnt / BACKUP이 실제로 마운트 해제되었습니다. 재미있는 우연의 일치 ..

종료하기 전에

자동 백업 서비스 :

[Unit]
Description=Slow backup script
DefaultDependencies=no
Before=shutdown.target

[Service]
ExecStart=/etc/systemd/system/do_backup.sh
Type=oneshot

systemctl edit shutdown.target

[Unit]
Requires=autobackup.service

출력은 기본적으로 동일합니다.

문제

문제는 systemd가 BACKUP을 마운트 해제하고 파이프 인프라를 비활성화하는 두 가지 경우에 다른 모든 종료 스크립트와 동시에 스크립트를 시작한다는 것입니다 (언 마운트가 빠르지 않은 경우 때때로 발생하는 또 다른 오류).

질문

시스템 종료시 먼저 스크립트를 시작하고 종료 될 때까지 기다렸다가 나머지 종료 스크립트 / 대상 / 단위 / 무엇을 시작하도록 systemd에 지시 할 수 있습니까?

답변:


12

서비스 파일을 만들거나 편집 할 필요가 없습니다. 간단히 스크립트를 넣습니다

/usr/lib/systemd/system-shutdown/

https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html

실제 시스템을 실행하기 직전에 중지 / 전원 차단 / 재부팅 / kexec systemd-shutdown은 / usr / lib / systemd / system-shutdown /의 모든 실행 파일을 실행하고 "halt", "poweroff", "reboot"중 하나의 인수를 전달합니다. 선택한 작업에 따라 "또는"kexec ". 이 디렉토리의 모든 실행 파일은 병렬로 실행되며 모든 실행 파일이 완료되기 전에 작업 실행이 계속되지 않습니다.

간단히 PC 스피커에서 경고음을냅니다.


2
이 디렉토리를 만들어야 했습니까? Ubuntu 16.04 또는 Raspbian (jessie)에는 둘 다 없습니다. 모두 시스템 기반입니다.
— WoJ

2
데비안 시스템은 다른 경로를 사용합니다 /lib/systemd/system-shutdown/. 또한이 스크립트는 파일 시스템이 이미 읽기 전용으로 마운트 된 후 시스템 종료시 매우 늦게 실행됩니다. 따라서 읽기 / 쓰기 ( mount -oremount,rw /) 로 다시 마운트하지 않으면 파일 시스템에 대한 쓰기 액세스가 실패 합니다. 재부팅 또는 종료시 / usr / lib / systemd / system-shutdown /에서 스크립트를 실행하는 방법을
— Frank Breitling

9
OP는 종료시 "다른 모든 것보다"스크립트 실행을 요청했습니다. 시스템 종료 스크립트는 다른 모든 것 이후, 커널을 죽이기 직전에 실행됩니다.
— Greg Alexander

11

알았습니다!

StopExec을 사용 하여 솔루션 장기 실행 프로세스를 수행하여 다음 과 같이 수정하십시오.

자동 백업 서비스 :

[Unit]
Description=Slow backup script
RequiresMountsFor=/mnt/BACKUP /home

[Service]
ExecStop=/etc/systemd/system/do_backup.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

라인을 참고하십시오 :

RequiresMountsFor=/mnt/BACKUP /home

이 방법으로 예상대로 작동합니다.


2
당신은 할 필요가 없습니다 systemctl edit. systemctl enable autobackup같은 효과가 있고 관용적이며 이미 [Install]섹션 이 있으므로 작동해야합니다 . 그래도 대상 이름에서 해당 오타를 수정해야합니다. ;)
— Stefan Majewsky

OMG 드라이브를 마운트 해제하기 전에 백업 스크립트를 호출하는 솔루션을 오랫동안 찾고있었습니다. 감사합니다!
— deanresin

2
이것은 나를 위해 작동하지 않습니다. 마운트가 없으므로 다른 장치를 종료하기 전에 스크립트를 실행하고 싶습니다.
— 2rs2ts
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.