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.