この違いがプログラム間で何であるかについて私は興味があります。systemctlで有効にしたときにsystemdで起動した場合と/etc/rc.local
、CLI で起動した場合やCLI で起動した場合。
たとえば、私は最近、ラズベリーパイにshairport-syncを使用していました。最初に、sudo systemctl enabled shairport-syncを使用してshairport-syncを開始するように設定しました。
後で、内部の機能を使用して、shairport-sync
接続するデバイスにスクリプトを実行したりポストしたりしました。
驚いたことに、スクリプトが実行されshairport-sync
たときkill
arecord
、aplay
しかし、私はスクリプトが実行され、殺された端子を介してスクリプトを実行しますarecord
とaplay
。
さらに混乱させるために、私shairport-sync
はそれを強制終了し、ターミナルを介して起動して、何が起こっているかの出力を確認しました。私はそのようにしたときのスクリプトは、デバイスが接続されて殺されたときに、私は期待通りに機能arecord
してaplay
。だから、修正として私は無効shairport-sync
にsysmtectl
してで実行するように設定する/etc/rc.local
クイックフィックスとして。その後、reboot
期待通りに機能しました。
これにより、の一部として実行されるsystemd
プログラムと、/etc/rc.local
またはCLIを介して開始されたときに実行されるプログラムには、いくつかの違いがあると私は思います。
なぜこれが起こるのですか?これは、実行レベルが異なるためですか?ダークマジック?
デバイスが接続するときに実行されるスクリプトはshairport-sync
次のとおりです。shairportstart.sh
#!/bin/sh
/usr/bin/sudo /bin/pkill arecord
if [ $(date +%H) -ge "18" -o $(date +%H) -le "7" ]; then
/usr/bin/amixer set Speaker 40%
else
/usr/bin/amixer set Speaker 100%
fi
/home/pi/shScripts/shairportfade.sh&
exit 0
フェードスクリプトは次のとおりです。 shairportfade.sh
#!/bin/sh
/usr/bin/amixer set Speaker 30-
for (( i=0; i<30; i++))
do
/usr/bin/amixer set Speaker 1+
done
exit 0
デバイスが切断されたときに実行されるスクリプトはshairport-sync
次のとおりです。shairportend.sh
#!/bin/sh
/usr/bin/amixer set Speaker 70%
/usr/bin/arecord -D plughw:1 -f dat | /usr/bin/aplay -D plughw:1 -f dat&
exit 0
/var/log/syslog
最初にshairport-syncをの一部として実行したときにのみ、次のエラーが見つかりましたsystemd
。shairport-sync
CLIから実行した場合、または/etc/rc.local
エラーが発生しなかった場合。
Jan 24 00:38:45 raspberrypi shairport-sync[617]: sudo: no tty present and no askpass program specified
唯一の違いはshairport-sync
、デバイスの接続または切断shairport-sync
が実行され続ける場合の最初の起動方法だけであることに注意してください。
/home/pi/shScripts/shairportfade.sh
か?
rc.local
ps ... awk ... grep ...
ようなものは、より単純なものに置き換えられる可能性がありますpkill