我想知道我在哪里可以安装这个执行 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
考虑到这一点时,您应该参考 中的图表,该图表描述了基于 - 的引导过程
man 7 bootup
的整体结构。systemd
您可以指定
WantedBy=sysinit.target
,但是您需要在该[Unit]
部分中指定几件事:也许还有
设置
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
,找到.device
与您的和/或您的 GPIO(如果存在)对应的单元ttyS5
,并将您的服务设置为运行After=
它们。如果事实证明您的脚本(或)无法正常运行
Before=sysinit.target
还为时过早,那么您可以尝试改用。zsh
WantedBy=basic.target
Before=basic.target
或者,如果“between
local-fs.target
andsysinit.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 中,并且您的引导脚本必须在尝试使用设备之前显式加载它们或检查它们是否已自动加载。