Raspberry PI/systemd: 종료/전원 끄기 시 스크립트를 실행하지만 다시 시작할 때는 실행하지 않음

Raspberry PI/systemd: 종료/전원 끄기 시 스크립트를 실행하지만 다시 시작할 때는 실행하지 않음

Raspberry PI(raspbian 실행)에서 스크립트를 실행해야 합니다.일시 휴업/전원 끄기, 하지만재부팅하지 않음.

나의 첫 번째 시도는 다음과 같이 서비스를 정의하는 것이었습니다.

[Unit]
Description=Power off service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/local/bin/poweroff.sh

[Install]
WantedBy=multi-user.target

이 방법은 효과가 있었지만 재부팅 시에도 스크립트가 실행 중이었습니다. 그래서 다른 대상에 설치하려고했습니다.

[Install]
WantedBy=shutdown.target halt.target

그러나 이 변경 후에는 스크립트가 전혀 실행되지 않습니다.

종료 시 실행되어야 하는 작업을 정의하는 올바른 방법은 무엇입니까?

답변1

내가 인터넷에서 수집한 것 중 가장 좋은 옵션은 Conflicts=reboot.target유닛 파일( [Unit]섹션)에 있는 다음 스크립트에서 다음을 실행하는 것입니다.

systemctl list-jobs | egrep -q 'reboot.target.*start'

reboot.target시작 예정인 경우 재부팅입니다. 그렇지 않으면 그렇지 않습니다. 명령이 "성공"하면 시스템이 재부팅됩니다. 그렇지 않으면 종료됩니다. 다음과 같이 사용할 수 있습니다.

if ! systemctl list-jobs | egrep -q 'reboot.target.*start'; then
  echo Shutting down
fi

답변2

다니엘의 대답은 질문의 문제를 해결합니다. 하지만 여전히 내가 필요한 것은 정확히 아니었습니다. 스크립트가 너무 일찍 호출되었고 가능한 한 늦게 실행되어야 했습니다(스크립트는 실제로 RPi의 GPIO핀에 연결된 릴레이를 사용하여 전원을 끕니다).

좀 더 시간을 투자한 후, 제가 찾던 바로 그 기능을 수행하는 훨씬 더 간단한 솔루션을 찾았습니다.

  1. /etc/systemd/system/systemd-poweroff.service.d아직 존재하지 않는 경우 디렉터리를 만듭니다.
  2. 디렉터리 poweroff.conf에 새 파일을 만듭니다 ./etc/systemd/system/systemd-poweroff.service.d
[Service]
ExecStartPre=/usr/local/bin/poweroff.sh

이 접근 방식을 사용하면 새로운 서비스를 추가할 필요가 없습니다.

관련 정보