종료하기 전에 pfsense 라우터를 정상적으로 종료하도록 Linux 상자(UPS에 연결됨)를 설정하고 있습니다. 저는 Ubuntu 16.04를 실행 중이고 systemd를 사용하여 이 작업을 수행하고 있습니다. systemd 서비스를 구성했는데 작동합니다. 그러나 종료하고 다시 시작할 때 스크립트를 시작합니다. Linux 박스를 재부팅할 때마다 라우터를 종료하기 때문에 이는 좋지 않습니다. 시스템 서비스가 종료 중에만 활성화되도록 어떻게 변경합니까?
내 설정은 다음과 같습니다.
[Unit]
Description=PFSense Shutdown script
After=poweroff.target
[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/path/to/script/pfsenseshutdown.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
참고로 pfenseshutdown.sh 스크립트는 매우 간단합니다.
#!/bin/bash
ssh [email protected] -i "sudo /etc/rc.halt"
어떤 도움이라도 대단히 감사하겠습니다.
답변1
다음 방법은 재부팅 시가 아닌 종료 시에만 스크립트를 실행하는 것으로 보입니다. systemd-poweroff.service
다음과 같이 파일을 편집 할 수 있습니다 .
sudo systemctl edit --full systemd-poweroff.service
이 [Service]
섹션에서는 다음 줄을 추가할 수 있습니다 ExecStartPre
.
ExecStartPre=/path/to/script/pfsenseshutdown.sh
이렇게 하면 그러나를 사용하여 시스템을 종료하면 스크립트가 실행되지 않습니다 halt
. 이 상황을 처리하려면 동일한 줄을 systemd-halt.service
.
이 접근 방식에서는 질문에 표시된 구성 파일이 사용되지 않습니다.
편집하다:이전 접근 방식의 한 가지 가능한 단점은 실행될 스크립트에 ssh
시스템을 종료하기 전에 제대로 작동하지 않을 수 있는 명령이 포함되어 있다는 것입니다(systemd가 필요한 네트워크 서비스를 중지했을 수 있음). 다음 방법은 이러한 상황을 방지하기 위한 것입니다.
pfsenseshutdown.service
이 솔루션을 위해 다음 내용으로 셀을 만들었습니다.
[Unit]
Description=PFSense Shutdown script
DefaultDedendencies=no
[Service]
Type=oneshot
ExecStart=/usr/bin/touch /dev/shm/shuttingdown
[Install]
WantedBy=systemd-halt.service systemd-poweroff.service
이 파일은 종료 루틴이 시작될 때 이 줄이 즉시 실행되어 ExecStart
파일이 /dev/shm/shuttingdown
존재하도록 하는 것으로 보입니다( /dev/shm
디렉토리는 메모리 내 파일 시스템이므로 재부팅 후에 지워집니다).
이제 네트워크가 완전히 초기화 해제되기 전에 스크립트가 실행되는지 확인하기 위해 다음을 실행했습니다.
systemctl edit --full networking.service
ExecStop
처음에는 내 우분투 16.04 가상 머신에 다음 줄이 포함되어 있었습니다.
ExecStop=/sbin/ifdown -a --read-environment
이 줄은 다음 예에서 스크립트를 먼저 실행하는 버전으로 대체되었습니다.
ExecStop=/path/to/script/pfsenseshutdown.sh && /sbin/ifdown -a --read-environment
그런 다음 스크립트는 pfsenseshutdown.sh
파일이 /dev/shm
존재하는지 테스트하고 그에 따라 ssh 명령을 실행합니다. 또한 많은 작업을 병렬로 수행하기 위해 systemd라는 작은 명령을 추가했습니다 sleep
. 이는 파일이 존재하지 않아 테스트가 실패하는 것을 방지하는 데 도움이 되기를 바랍니다.하지만.
#!/bin/bash
sleep 1
if [ -e /dev/shm/shuttingdown ] ; then
# Your ssh command here
fi