我想知道在哪里可以安装这个执行 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
设置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
相对应的单元,然后设置您的服务来运行它们。ttyS5
After=
如果事实证明您的脚本(或)正常运行Before=sysinit.target
还为时过早,那么您可以尝试改为。zsh
WantedBy=basic.target
Before=basic.target
或者,如果“ Between local-fs.target
and sysinit.target
”对您来说还不够早,那么您必须编写一个initramfs-tools
钩子脚本(放入/etc/initramfs-tools/hooks
)来将您的脚本和它可能需要的其他所有内容打包到 initramfs 中update-initramfs
,并将当前脚本更改为一个initramfs-tools 启动脚本(放置到其中一个/etc/initramfs-tools/scripts/*/
目录中)。
不过,我建议不要使用zsh
shell 及其要求来使 initramfs 膨胀:如果您想转到 initramfs 路线,/bin/dash
则应该首先使启动时脚本可以使用(轻量级 POSIX shell)运行,因为这是默认 shell存在于现代 Debian/Ubuntu 的 initramfs 中。
挂钩脚本和引导脚本都有需要遵循的特定要求:man 7 initramfs-tools
都有关于两种类型脚本的示例。
您还需要处理这样一个事实:在 initramfs 期间,所有设备可能尚未初始化:udev
在加载内核模块时将忙于创建设备。您的钩子脚本必须确保您的驱动程序/dev/ttyS5
和 GPIO 将包含在 initramfs 中,并且您的引导脚本必须显式加载它们或在尝试使用设备之前检查它们是否已自动加载。