システムランチャーとターミナルランチャーの違い

システムランチャーとターミナルランチャーの違い

/etc/rc.localCLIを介さずにsystemctlを介してアクティブ化するときにsystemdを使用して実行する場合、これらのプログラムの違いは何ですか?

たとえば、私は最近Raspberry Piでhairport-syncを使用しました。最初は、sudo systemctlenabled hairport-syncを介して起動するようにhairport-syncを設定しました。

後で機能の1つを使用してshairport-syncスクリプトを事前に実行し、接続されたデバイスに公開しました。

驚くべきことに、スクリプトshairport-synckill arecordaplay

ところで、端末を介してスクリプトを実行すると、スクリプトが実行され終了し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/sysloghairport-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で何かを実行するたびに違いを説明する可能性があります。

  1. さまざまな環境変数。そのセクションでsystemd渡される環境変数を記録します。man systemd.exec生成されたプロセスの環境変数。違いを直接確認するには、systemd-run /path/to/binarysystemd サービスで実行されているかのように一時的な範囲でアプリケーションを実行できます。次の出力が表示されます。これで出力を見ることRunning as unit: run-u160.serviceができます。journalctl -u run-u160.service受け取る環境変数をダンプするようにアプリケーションを変更し、CLI実行をsystemd実行と比較します。アプリケーションが簡単に変更されない場合は、systemd-run env渡される環境変数を調べて、生成されたロギングを確認できます。 X11 GUIアプリケーションを実行しようとすると、DISPLAY環境変数を設定する必要があります。。この場合は、デスクトップ環境の「自動起動」機能を代わりに使用してみてくださいsystemd
  2. リソース制限。バラよりman systemd.resource-controlリソース消費を制限するために使用される構成値。systemctl show your-unit-unit.service開始したいサービスに影響を与える全体的な設定値を確認するために使用されます。
  3. 非対話型シェル。あなたのbashCLI環境は対話型ログインシェル.bashrc以前はなかったソースファイルがあります。systemd環境変数の設定に加えて、これらのスクリプトはSSH操作にログインする必要がないようにSSHエージェントに接続するなど、他の多くの操作を実行できます。また、見ることができますログインシェルと非ログインシェルの違いは何ですか?
  4. テレタイプなし。インタラクティブセッションは、一部のプログラムがパスワードを入力するように求められたときに使用される予定のsudoTTYに接続されます。sshまた、見ることができますsudo:ttyが存在せず、Askpassプログラムが指定されていません。
  5. 相対パスと絶対パス。相対バイナリはシェルで動作しますが、に記録されているようにman systemd.serviceの場合、最初のパラメータはExecStart=バイナリファイルの絶対パスでなければなりません。
  6. 制限付きコマンドライン構文。 Shell CLIはさまざまなメタ文字をサポートしていますsystemdコマンドライン構文は非常に制限的です。。必要に応じて、シェルを介してコマンドをsystemd明示的に実行してシェル構文を複製できます。ExecStart=/bin/bash -c '/my/bash $(syntax) >/goes-here.txt'

これは、リソース制御によって一貫した環境でコードを実行するシステムの機能です。長期的には、これはハードウェアに負担をかけることなく繰り返し可能で安定した結果を得るのに役立ちます。

関連情報