아치 리눅스 시스템 RTC 시계 스크립트가 실행되지 않습니다

아치 리눅스 시스템 RTC 시계 스크립트가 실행되지 않습니다

나는 rtc.service다음과 같은 분야에서 서비스를 제공합니다 /etc/systemd/system:

[Unit]
Description=RTC Service

[Install]
WantedBy=multi-user.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/scripts/script_rtc.sh

그러나 script_rtc.sh존재하며 실행 가능합니다.

[user@comp001 scripts]# ls -asl script_rtc.sh
4 -rwxr-xr-x 1 root root 79 Jan  1 01:04 script_rtc.sh
[user@comp001 scripts]#

/scripts/script_rtc.sh다음은 i2c를 통해서만 실시간 시계를 활성화하는 스크립트입니다 .

[user@comp001 scripts]# cat script_rtc.sh
#!/bin/sh

sudo echo "ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device"
[user@comp001 scripts]#

systemclt -u rtc.service결과 는 다음과 같습니다 .

Jan 01 01:00:10 comp001 systemd[1]: Starting RTC Service...
Jan 01 01:00:12 comp001 systemd[1]: rtc.service: main process exited, code=exited, status=203/EXEC
Jan 01 01:00:12 comp001 systemd[1]: Failed to start RTC Service.
Jan 01 01:00:12 comp001 systemd[1]: Unit rtc.service entered failed state.
Jan 01 01:00:12 comp001 systemd[1]: rtc.service failed.

좋아, 에코를 테스트하기 위해 스크립트 자체를 수정했습니다.

#!/bin/sh

echo "ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device"

이제 다음을 수행하여 제어할 수 있습니다. systemctl하지만 그렇게 하면 다음과 같이 됩니다.

#!/bin/sh

echo "ds1307 0x68" > /sys/class/i2c-adapter/i2c-1/new_device

I get error:
[root@comp001 scripts]# ./script_rtc.sh 
./script_rtc.sh: line 3: echo: write error: Invalid argument
[root@comp001 scripts]#

왜? ?

답변1

어느 쪽이든 스크립트가 실행되지 않습니다.

  • 쉘에서 시작해 보세요
  • check noexec, SELinux 등 (보안 제한 사항에 관계없이)
  • 스크립트의 첫 번째 줄에서 shebang을 확인하십시오(# 앞의 공백, ! 앞의 공백, 존재하는지 확인 /bin/sh).

덧붙여서:

  • sudo스크립트에서 제거되었으며 이미 루트로 실행 중입니다.
  • 리디렉션을 인용하면 안 됩니다 echo "foo" > file.echo "foo > file"

하지만

스크립트가 실행된다는 보장은 없습니다.뒤쪽에 i2c-1초기화되었으므로경쟁 조건여기. 스크립트를 완전히 사용하는 것보다 udev 규칙을 사용하는 것이 더 좋습니다.

ACTION=="add", SUBSYSTEM=="i2c", ATTR{name}=="<contents of file /sys/class/i2c-adapter/i2c-1/name>", ATTR{new_device}="ds1307 0x68"

이 줄을 에 넣으세요 /etc/udev/rules.d/99-i2c-rtc.rules.

답변2

에코는 다음과 같아야 합니다.

echo "ds1307 0x68">/sys/class/i2c-adapter/i2c-1/new_device

공백이 없습니다. 이것은 나에게 효과적입니다. 절대 잊지 마세요:

systemctl enable <your.service>... 

관련 정보