哪里可以安装尽早执行zsh脚本的systemd服务

哪里可以安装尽早执行zsh脚本的systemd服务

我想知道在哪里可以安装这个执行 zsh 脚本的服务尽快运行我的脚本

脚本使用 /dev/ttyS5 处的串行端口和 gpio 引脚。

是否有比该更早的目标multi-user.target仍然可以运行 zsh 脚本?

[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 bootup的整体结构。systemd

您可以指定WantedBy=sysinit.target,但随后您需要在该[Unit]部分中指定一些内容:

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

也许还有

ConditionPathExists=/dev/ttyS5

设置DefaultDependenciesno允许您的服务在启动过程中较早运行,但也要求您更明确地了解服务的要求。

由于脚本位于/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 sysinit.target”对您来说还不够早,那么您必须编写一个initramfs-tools钩子脚本(放入/etc/initramfs-tools/hooks)来将您的脚本和它可能需要的其他所有内容打包到 initramfs 中update-initramfs,并将当前脚本更改为一个initramfs-tools 启动脚本(放置到其中一个/etc/initramfs-tools/scripts/*/目录中)。

不过,我建议不要使用zshshell 及其要求来使 initramfs 膨胀:如果您想转到 initramfs 路线,/bin/dash则应该首先使启动时脚本可以使用(轻量级 POSIX shell)运行,因为这是默认 shell存在于现代 Debian/Ubuntu 的 initramfs 中。

挂钩脚本和引导脚本都有需要遵循的特定要求:man 7 initramfs-tools都有关于两种类型脚本的示例。

您还需要处理这样一个事实:在 initramfs 期间,所有设备可能尚未初始化:udev在加载内核模块时将忙于创建设备。您的钩子脚本必须确保您的驱动程序/dev/ttyS5和 GPIO 将包含在 initramfs 中,并且您的引导脚本必须显式加载它们或在尝试使用设备之前检查它们是否已自动加载。

相关内容