저는 e-잉크 화면을 갖춘 작은 Linux 기반 장치를 만들었습니다. 컴퓨터가 종료되기 전에 화면을 지울 수 있다면 화면의 수명이 연장될 것 같습니다. (EInk는 전원이 없어도 수동적으로 이미지를 계속 표시하지만, 이미지가 항상 동일할 경우 화상이 번질 수 있습니다.) 그런데 제 저가형 모니터에서는 화면이 꺼지는 데 시간이 꽤 걸립니다. 30 초.
종료 스크립트를 /etc/rc0.d/K01foobar에 넣었지만 실행되지 않는 것 같습니다. 로그 파일에 쓰기 위해 스크립트 상단에 일부 코드를 추가하려고 시도했지만 로그 파일이 기록되지 않았습니다. 스크립트는 전역적으로 실행 가능하며 맨 위에 #!/bin/sh가 있습니다.
여기서 무슨 일이 일어나고 있는지 아시나요? 잘못된 런레벨을 사용하고 있습니까? 실행이 완료되기 전에 스크립트가 종료됩니까? 그때쯤에는 파일 시스템이 닫혀서 로그 파일에 쓰기 위해 파일 시스템에 접근할 수 없는 걸까요?
답변1
내가 찾은이 블로그 게시물SysV와 systemd에서 작동하는 방식을 잘 비교하고, 파일 시스템이 읽기 전용이 되고 실행하려는 명령이 잠재적으로 오랜 시간이 걸리는 문제를 처리하는 방법을 설명합니다. 다음 스크립트는 기본적으로 그가 systemd에 제공한 스크립트에 약간의 수정을 가한 것입니다.
브라우니_shutdown.sh:
#!/bin/bash
# see https://fitzcarraldoblog.wordpress.com/2018/01/13/running-a-shell-script-at-shutdown-only-not-at-reboot-a-comparison-between-openrc-and-systemd/
REBOOT=$( systemctl list-jobs | egrep -q 'reboot.target.*start' && echo "rebooting" || echo "not_rebooting" )
if [ $REBOOT = "not_rebooting" ]; then
/usr/bin/python /home/pi/Documents/programming/brownie/brownie_blank.py
fi
브라우니_오프.서브:
# see https://fitzcarraldoblog.wordpress.com/2018/01/13/running-a-shell-script-at-shutdown-only-not-at-reboot-a-comparison-between-openrc-and-systemd/
[Unit]
Description=Blank out the eInk screen before shutting down
DefaultDependencies=no
Before=shutdown.target halt.target
# The following is required because my scripts are in /home:
RequiresMountsFor=/home
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/brownie_shutdown.sh
[Install]
WantedBy=halt.target shutdown.target
파일 생성:
configure_shutdown:
cp brownie_shutdown.sh /usr/local/sbin/brownie_shutdown.sh
chmod +x /usr/local/sbin/brownie_shutdown.sh
cp brownie_shutdown.service /etc/systemd/system/brownie_shutdown.service
systemctl enable brownie_shutdown.service
Bash 스크립트에서 최상위 코드는 시작과 종료를 구별합니다. 내 스크립트가 /home에 있으므로 .service 파일에는 RequiresMountsFor=/home 줄이 있습니다. ExecStart 라인은 bash 스크립트를 가리킵니다. makefile은 루트로 실행되어야 합니다.
블로그 게시물에는 이러한 변경 사항을 적용하려면 재부팅해야 한다고 나와 있지만 실제로는 시스템을 종료하자마자 바로 작동한 것으로 나타났습니다. 그는 작업에 시간이 오래 걸릴 수 있다는 문제에 대해 이야기했는데, 이는 나에게도 적용되며 온라인에서 찾은 다른 솔루션으로는 작업을 완료할 수 없다고 말했습니다. 그러나 그는 자신의 코드의 어떤 기능이 작동하는지 설명하지 않습니다.