systemd 스크립트가 시작 시 예상한 결과를 생성하지 않지만 올바르게 생성하는 이유는 무엇입니까?

systemd 스크립트가 시작 시 예상한 결과를 생성하지 않지만 올바르게 생성하는 이유는 무엇입니까?

Raspbian Stretch에 Raspberry Pi가 있고 부팅 시 일부 GPIO 핀을 활성화하고 싶습니다.

나는 다음 서비스를 작성했습니다.

[Unit]
Description=GPIO23 exported as output, value off

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo "23" > /sys/class/gpio/export'
ExecStart=/bin/bash -c 'echo "out" > /sys/class/gpio/gpio23/direction'
ExecStart=/bin/bash -c 'echo "0" > /sys/class/gpio/gpio23/value'
StandardOutput=null

[Install]
Alias=gpio23.service

SSH를 통해 로그인한 후 결과를 확인합니다.

pi@Hi-Fi:~ $ systemctl status gpio23
● gpio23.service - GPIO23 exported as output, value off
   Loaded: loaded (/lib/systemd/system/gpio23.service; linked; vendor preset: enabled)
   Active: inactive (dead)
pi@Hi-Fi:ls /sys/class/gpio/
export  gpiochip0  unexport

아직 실행되지 않았거나 예상대로 작동하지 않았기 때문에 서비스를 수동으로 시작했습니다.

pi@Hi-Fi:~ $ sudo systemctl start gpio23
[sudo] password for pi:
pi@Hi-Fi:~ $ systemctl status gpio23
● gpio23.service - GPIO23 exported as output, value off
   Loaded: loaded (/lib/systemd/system/gpio23.service; linked; vendor preset: enabled)
   Active: inactive (dead)

Jan 01 19:31:12 Hi-Fi systemd[1]: Starting GPIO23 exported as output, value off...
Jan 01 19:31:12 Hi-Fi systemd[1]: Started GPIO23 exported as output, value off.
pi@Hi-Fi:~ $ ls /sys/class/gpio/
export  gpio23  gpiochip0  unexport

이제 괜찮아.

즉시 예상대로 작동하게 하려면 어떻게 해야 합니까?

답변1

[설치하다]
별칭=gpio23.service

WantedBy해당 섹션에 설정이 없다는 점을 알아차리는 것만큼 간단합니다. 서비스를 활성화하도록 systemd에 지시했지만 실제로 활성화할 때 어떤 대상이 서비스를 요구해야 하는지 설명하지 않았습니다.

표준 출력 = 비어 있음

이것을 매일 실천하는 것은 현명하지 않습니다. 실제 문제가 발생할 때까지 표준 출력을 기록하도록 하십시오(몇 가지 명령의 경우와는 분명히 다릅니다 echo).

ExecStart=/bin/bash ...

그리고 마찬가지로 Bashism에 명시적으로 의존하고 (다시) 특정 명령을 사용하지 않는 한 Bourne Again 쉘의 이름을 지정하지 마십시오 echo.

10년 전 Debian과 Ubuntu 사람들은 시스템 부팅 프로세스에서 Bourne Again 셸을 제거하고 이를 비대화형 모드에서 초기화 오버헤드가 훨씬 적은 Almquist 셸로 교체하기 위해 많은 노력을 기울였으며 결과적으로 부팅 시간이 훨씬 빨라졌습니다. . 어디에서나 사용 가능 /bin/bash- 시스템화된 서비스 장치에서도 사용 가능! — 대신에 /bin/sh, 이 좋은 일을 망칠 것입니다.

관련 정보