나는 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>...