できるだけ早くzshスクリプトを実行するためにsystemdサービスをどこにインストールできますか?

できるだけ早くzshスクリプトを実行するためにsystemdサービスをどこにインストールできますか?

zshスクリプトを実行しているこのサービスをどこにインストールできるかを知りたいです。できるだけ早くスクリプトを実行してください。

スクリプトは/dev/ttyS5のシリアルポートとgpioピンを使用します。

multi-user.targetzshスクリプトを引き続き実行できるよりも古いターゲットはありますか?

[Unit]
Description=Acer projector control
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/zsh /usr/local/bin/ff.zsh -a acer
ExecStop=/usr/bin/zsh /usr/local/bin/ff.zsh -rb acer
RemainAfterExit=yes
Restart=on-failure
RestartSec=10s
TimeoutSec=5min

[Install]
WantedBy=multi-user.target

アップデート 2.

[Unit]
Description=Acer projector control
DefaultDependencies=no
After=local-fs.target
After=systemd-modules-load.service
Before=sysinit.target
ConditionPathExists=/dev/ttyS5
Before=shutdown.target
Conflicts=shutdown.target

[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/usr/bin/zsh /usr/local/bin/ff.zsh -a acer
ExecStop=/usr/bin/zsh /usr/local/bin/ff.zsh -rb acer
Restart=on-failure
RestartSec=30s
TimeoutSec=5min

[Install]
WantedBy=sysinit.target

答え1

これを考慮すると、ベースブートプロセスの全体的な構造を説明するの図を参照する必要がありますman 7 bootupsystemd

を指定できますが、次のセクションで何かを指定する必要がWantedBy=sysinit.targetあります。[Unit]

[Unit]
DefaultDependencies=no
After=local-fs.target
After=systemd-modules-load.service
Before=sysinit.target

たぶんあるかもしれません

ConditionPathExists=/dev/ttyS5

DefaultDependenciesこれを設定すると、noサービスは開始プロセスの最初に実行される可能性がありますが、サービス要件についてより明示的に指定する必要があります。

スクリプトは/usr/local別のファイルシステムに配置されているため、スクリプトを実行する前にファイルシステムがマウントされていることを確認する必要があります。これはによって達成することができますAfter=local-fs.target

/dev/ttyS5また、スクリプトが積極的にロードされない限り、カーネルモジュールとGPIOがロードされていることを確認する必要があります。これを達成するために、適切なモジュールを指定するためにファイルをAfter=systemd-modules-load.service使用したとします。/etc/modules-load.d/*.confを実行し、systemctl list-units *.deviceそのデバイスおよび/またはGPIO(存在する場合)に対応するデバイスを見つけて、.deviceそれを実行するようにサービスを設定することもできます。ttyS5After=

スクリプトが正常に動作するか動作するには早すぎると判断した場合は、代わりにBefore=sysinit.target試してみてください。zshWantedBy=basic.targetBefore=basic.target


あるいは、「Between local-fs.targetand」が十分に達していない場合は、スクリプトと必要なものすべてをinitramfsにパッケージ化するためにフックスクリプト(挿入)をsysinit.target作成し、現在のスクリプトを1つに変更する必要があります。initramfs-tools/etc/initramfs-tools/hooksupdate-initramfsinitramfs-tools 起動スクリプト/etc/initramfs-tools/scripts/*/(ディレクトリの1つに入れてください)。

しかし、私はzshシェルとその要件でinitramfsを膨らませることをお勧めします。 initramfsパスに行きたい場合は、/bin/dashまず(軽量POSIXシェル)を使用して起動時間スクリプトを実行可能にする必要があります。これが存在する基本シェルだからです。現代 Debian で/Ubuntu の initramfs から。

フックスクリプトとブートストラップスクリプトの両方に従う必要がある特定の要件があります。man 7 initramfs-tools2種類のスクリプトの例があります。

また、initramfs中にすべてのデバイスがまだ初期化されていない可能性があるという事実も処理する必要があります。udevカーネルモジュールのロード中にデバイスを作成するのは忙しいでしょう。フックスクリプトはドライバ/dev/ttyS5とGPIOがinitramfsに含まれていることを確認し、起動スクリプトはそれらを明示的にロードするか、デバイスを使用する前に自動的にロードされていることを確認する必要があります。

関連情報