/etc/rc.local
CLIを介さずにsystemctlを介してアクティブ化するときにsystemdを使用して実行する場合、これらのプログラムの違いは何ですか?
たとえば、私は最近Raspberry Piでhairport-syncを使用しました。最初は、sudo systemctlenabled hairport-syncを介して起動するようにhairport-syncを設定しました。
後で機能の1つを使用してshairport-sync
スクリプトを事前に実行し、接続されたデバイスに公開しました。
驚くべきことに、スクリプトshairport-sync
はkill
arecord
aplay
ところで、端末を介してスクリプトを実行すると、スクリプトが実行され終了しarecord
ますaplay
。
自分自身をさらに混乱させるために、ターミナルを介して終了してshairport-sync
開始し、何が起こっているのかを確認しました。これにより、デバイスが接続されシャットダウンされると、期待どおりにスクリプトがarecord
実行されますaplay
。そのため、修正でこれを無効にし、クイックshairport-sync
修正で実行するように設定しましたsysmtectl
。/etc/rc.local
その後はreboot
期待通りに働きました。
systemd
これにより、スタンドアロンで実行されるプログラムとCLIを介して実行されるプログラムの間にわずかな違いがあると信じていました。/etc/rc.local
なぜこれが起こるのですか?ランレベルが違うからですか?闇の魔法?
デバイスが接続されたときに実行されるスクリプトは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
hairport-syncがCLIで最初に実行されたときにsystemd
.whenとして実行されたか、エラーがない場合にのみ適用されます。shairport-sync
/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
。
答え1
変形「systemdで状況が異なるように動作するのはなぜですか?」よくある質問です。
systemdではなくCLIで何かを実行するたびに違いを説明する可能性があります。
- さまざまな環境変数。そのセクションで
systemd
渡される環境変数を記録します。man systemd.exec
生成されたプロセスの環境変数。違いを直接確認するには、systemd-run /path/to/binary
systemd サービスで実行されているかのように一時的な範囲でアプリケーションを実行できます。次の出力が表示されます。これで出力を見ることRunning as unit: run-u160.service
ができます。journalctl -u run-u160.service
受け取る環境変数をダンプするようにアプリケーションを変更し、CLI実行をsystemd実行と比較します。アプリケーションが簡単に変更されない場合は、systemd-run env
渡される環境変数を調べて、生成されたロギングを確認できます。 X11 GUIアプリケーションを実行しようとすると、DISPLAY
環境変数を設定する必要があります。。この場合は、デスクトップ環境の「自動起動」機能を代わりに使用してみてくださいsystemd
。 - リソース制限。バラより
man systemd.resource-control
リソース消費を制限するために使用される構成値。systemctl show your-unit-unit.service
開始したいサービスに影響を与える全体的な設定値を確認するために使用されます。 - 非対話型シェル。あなたの
bash
CLI環境は対話型ログインシェル。.bashrc
以前はなかったソースファイルがあります。systemd
環境変数の設定に加えて、これらのスクリプトはSSH操作にログインする必要がないようにSSHエージェントに接続するなど、他の多くの操作を実行できます。また、見ることができますログインシェルと非ログインシェルの違いは何ですか? - テレタイプなし。インタラクティブセッションは、一部のプログラムがパスワードを入力するように求められたときに使用される予定の
sudo
TTYに接続されます。ssh
また、見ることができますsudo:ttyが存在せず、Askpassプログラムが指定されていません。 - 相対パスと絶対パス。相対バイナリはシェルで動作しますが、に記録されているように
man systemd.service
の場合、最初のパラメータはExecStart=
バイナリファイルの絶対パスでなければなりません。 - 制限付きコマンドライン構文。 Shell CLIはさまざまなメタ文字をサポートしています
systemd
コマンドライン構文は非常に制限的です。。必要に応じて、シェルを介してコマンドをsystemd
明示的に実行してシェル構文を複製できます。ExecStart=/bin/bash -c '/my/bash $(syntax) >/goes-here.txt'
これは、リソース制御によって一貫した環境でコードを実行するシステムの機能です。長期的には、これはハードウェアに負担をかけることなく繰り返し可能で安定した結果を得るのに役立ちます。