私は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
スクリプトから削除され、すでにrootとして実行されています。- リダイレクトを引用しないでください
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
。