종료 직전에 systemd로 스크립트를 실행하는 방법은 무엇입니까?


58

시스템 [install]섹션이 /home/me/so.pl종료 직전과 /proc/self/net/dev파괴 되기 전에 실행되도록 섹션 에 무엇을 넣어야 합니까?

[Unit]
Description=Log Traffic

[Service]
ExecStart=/home/me/so.pl

[Install]
?

답변:


66

제안 된 솔루션은 서비스 유닛을 일반 서비스로 실행하는 것 [Install]입니다. 섹션을 살펴보십시오 . 따라서 모든 것이 역으로 생각되어야하며 종속성도 고려해야합니다. 종료 순서는 역순으로하기 때문입니다. 그렇기 때문에 스크립트를에 배치해야합니다 ExecStop=.

다음 해결책이 나를 위해 일하고 있습니다.

[Unit]
Description=...

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>

[Install]
WantedBy=multi-user.target

RemainAfterExit=trueExecStart행동 이 없을 때 필요 합니다.

파일을 만든 후 systemctl daemon-reload및 을 확인하십시오 systemctl enable yourservice --now.

나는 방금 시스템 IRC에서 그것을 얻었고, 크레딧은 mezcalero로 갈 것입니다.


6
우분투 16.04에서 당신은 있어야합니다 ExecStart=/bin/true.
niels

3
서비스가 실행 중이 아니라고 생각되면 실행을 시도하지 않기 때문에 WHY에 대한 나의 가정 RemainAfterExit=true이 필요합니다 . 원인 을 생각 서비스함으로써 그것을 실행하는 원인이 실행되고 종료시. ExecStartsystemdExecStopRemainAfterExit=truesystemdExecStop
Felipe Alvarez

1
어쨌든 사용자 세션과 사용자 프로세스가 종료되기 전에이 스크립트가 실행되고 완료되도록해야합니까?
richmb

@richmb 전혀 없습니다. 로부터 문서 :Note that it is usually not sufficient to specify a command for this setting that only asks the service to terminate (for example, by queuing some form of termination signal for it), but does not wait for it to do so.
svenwltr

나는 이것과 다양한 반복을 시도했지만 데비안 스트레치에서는 작동하지 않습니다.
2rs2ts

8

내가 볼 수있는 한 이것이 필요한 것을 수행합니다 (그러나 나는 왜 그런지 정확히 알지 못합니다).

[Unit]
Description=Log Traffic
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target


[Service]
ExecStart=/usr/local/bin/perl /home/me/log_traffic.pl --stop
Type=oneshot

3
1) DefaultDependencies = no는 모든 종속성을 무시하고 시작시 "처음에"실행하고 중지시 "마지막에"실행하며 항상 "이전"및 "이후"절을 준수합니다. 2) 종료 / 재부팅 / 정지 대상에 Before 절이 있으므로 종료 / 종료 / 정지에 도달하기 직전에 실행됩니다 (정지시에만 실행되므로 원하는 작업을 수행함).
RDP

kexec.targetBefore bit
hanetzer

이것은 나를 위해 작동하지 않습니다
Bug Killer

난 당신이 또한 추가하지 않는 한이 작동 표시되지 않습니다 WantedBy=shutdown.target reboot.target halt.target받는 [Unit]부분. Before=& After=의존성을 바꾸지 마십시오.
rsaw

1
@FelipeAlvarez : 내 의견을 제거했습니다.
sid_com 2016 년

7
  • reboot / shutdown / halt / kexec 서비스 를 시작하기 직전 에 서비스를 실행하려면 (즉, 루트 파일 시스템이 읽기 전용으로 다시 마운트되기 전 마지막 순간에)이 서비스 구성을 사용하십시오.

    [Unit]
    Description=Save system clock on shutdown
    DefaultDependencies=no
    After=final.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/lib/systemd/scripts/fake-hwclock.sh save
    
    [Install]
    WantedBy=final.target
    

    다음을 사용하여 활성화하십시오.

    systemctl enable my_service.service
    
  • 실제 재부팅 / 종료 / 중지 / kexec 직전 에 스크립트를 실행하려면 (읽기 전용으로 다시 마운트되어 루트 파일 시스템에 쓸 수없는 경우)이 스크립트 실행 파일을 /usr/lib/systemd/system-shutdown디렉토리에 추가하십시오 .

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

참조 :

https://www.freedesktop.org/software/systemd/man/bootup.html

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


1
재부팅을 시작한 후 가능한 한 가까운 곳에서 무언가를 실행하고 싶습니다 final.target. 이상적으로는 사용자가 수행 한 후에 가장 먼저 실행되고 싶습니다 $ sudo reboot.
Jaime Hablutzel

5

나는 확실하지 않지만 명시 적으로 추가했지만 설치 부분이 필요하다고 생각하지 않습니다. 또한 테스트하지는 않았지만 시작하는 데 도움이되어야한다고 생각합니다.

[Unit]
Description=Log Traffic
Requires=network.target
After=network.target
Before=shutdown.target
DefaultDependencies=no

[Service]
ExecStart=/home/me/so.pl
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=shutdown.target

이 작업을 시도하면 시작 (부팅) 직후 스크립트가 실행됩니다.
sid_com

@sid_com 읽은 후 thread.gmane.org/gmane.comp.sysutils.systemd.devel/4515/...이 DefaultDependencies을 추가하려고 = 아니오 그리고 어쩌면 설치 섹션을 제거합니다. 그렇지 않으면 사후 / 필수 회선을 원격으로 연결하는 데 도움이 될 수 있습니다.
Ulrich Dangel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.