bash 스크립트는 종료 시 시작되지만 재부팅 시에는 시작되지 않습니다.

bash 스크립트는 종료 시 시작되지만 재부팅 시에는 시작되지 않습니다.

종료하기 전에 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

관련 정보