파일 시스템이 읽기 전용으로 다시 마운트된 후 종료 시 스크립트를 실행할 수 있는 방법이 있습니까?
나는 송신기와 스크립트를 통해 제어할 수 있는 무선 소켓에 연결된 라즈베리 파이를 가지고 있습니다. 파일 시스템이 읽기 전용으로 마운트된 후 종료 시 해당 소켓의 전원을 끄고 싶습니다(라즈베리 전원 끄기).
나는 이것을 시도했습니다 :
[Unit]
Description=Test
DefaultDependencies=no
Requires=shutdown.target umount.target final.target
After=shutdown.target umount.target final.target
[Service]
Type=oneshot
ExecStart=/test
KillMode=none
[Install]
WantedBy=halt.target
/test 스크립트는 현재 마운트를 출력합니다. 종료 시 실행되면 예상대로 읽기 전용이 아닌 루트 파일 시스템에 대한 읽기/쓰기 상태가 표시됩니다.
편집하다:
/test의 내용:
#!/bin/bash
echo -n 'Debug-Mount: ' > /dev/tty1
cat /proc/mounts | grep /dev/sda > /dev/tty1
종료 시 화면 출력:
답변1
믿을 수 있는 해결책을 찾았습니다. 스크립트를 /usr/lib/systemd/system-shutdown/에 넣으세요.
또한보십시오:https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
실제 시스템을 실행하기 직전에 quit/poweroff/reboot/kexec systemd-shutdown은 /usr/lib/systemd/system-shutdown/에 있는 모든 실행 파일을 실행하고 "halt", "poweroff", "reboot"라는 하나의 인수를 전달합니다. " 또는 "kexec"(선택한 작업에 따라 다름) 이 디렉터리의 모든 실행 파일은 병렬로 실행되며 모든 실행 파일이 완료되기 전에는 작업 실행이 계속되지 않습니다.
답변2
원래 스크립트와 관련하여 일반적으로 Halt.target 이전에 실행되었으며(halt.target 이전에 주문하지 않았음을 참고) 해당 시점에서 파일 시스템이 다시 마운트되지 않습니다. systemd-shutdown(halt.target에 도달한 후 마지막에 systemd exec가 실행됨), 항목을 종료하고(아마도 순서가 지정되지 않은 스크립트와 함께 =)) 최종 umount/swapoff/losetup을 실행하고, 할 수 없는 것을 ro 다시 마운트합니다. 마운트 해제된 다음 시스템 종료 디렉토리에서 병렬 항목으로 실행된 다음 종료가 존재하는 경우 /run/initrams로ivot_root()를 시도합니다(그렇지 않거나 피벗이 실패하면 정지를 진행합니다).