很多年前,我们可以编写我们的启动脚本 /etc/rc.local
。加载所有系统服务后,您的脚本将运行。
现在,我们使用systemd,我们没有 rc.local
了。 Systemd并行启动服务。您可以编写自己的服务来执行rc.local`,但无法确保它将在加载所有系统服务后运行。
有办法吗?或者我们必须使用 Before
和 After
在systemd服务文件中?
很多年前,我们可以编写我们的启动脚本 /etc/rc.local
。加载所有系统服务后,您的脚本将运行。
现在,我们使用systemd,我们没有 rc.local
了。 Systemd并行启动服务。您可以编写自己的服务来执行rc.local`,但无法确保它将在加载所有系统服务后运行。
有办法吗?或者我们必须使用 Before
和 After
在systemd服务文件中?
Answers:
在systemd中,建议使用Before =和After =来很好地围绕其他服务订购服务。
但是既然你没有使用Before和After,那么你可以使用:
Type=idle
作为 man systemd.service
说明
非常类似于简单,但服务二进制文件的实际执行被延迟到所有 派遣工作。这可以用于避免将shell服务的输出与状态输出交错 在控制台上。
/proc/sys/kernel/modules_disabled
至 1
在引导过程结束时
这实际上取决于你对“引导”的定义。我假设你希望它在getty启动后立即运行。为此,您需要将服务添加到 /etc/systemd/system/getty.target.wants/
目录。您还应确保您的文件使用与此目录中的其他服务类似的代码。要在启动和关机时运行自定义服务(只是发出蜂鸣声我的主板蜂鸣器)我使用以下脚本 /etc/systemd/system/getty.target.wants/service_name.service
[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes
[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true
[Install]
WantedBy=basic.target
/usr/bin/myinitscript.sh
是可执行的,并且在开始时有一个shebang。
请注意,并非所有内容都将在引导时启动,但这是用户显示登录提示的位置
虽然这确实有用 Before=
和 After=
,这对我来说更容易理解,实际上是有效的;我没有找到上面的答案足够的信息。这也允许您使用两者 ExecStart=
和 ExecStop=
而不是局限于 Type=simple
像服务。
我不熟悉具体细节或ArchLinux,但这里是如何管理systemd的。
好吧,基本上systemd是/etc/init.d/中的脚本集合,由/etc/rcX.d中的符号链接指向,其中X是运行级别的数量。符号链接本身具有以下格式:
[K | S] + nn + [string]
哪里:
因此,如果您希望脚本在引导顺序中最后运行,则需要执行以下操作:
runlevel
ls /etc/rc<target runlevel>.d/
并选择一个比已经存在的任何其他数字更大的两位数字。 update-rc.d
适用于Debian或 chkconfig
对于Fedora或手动,为您的init脚本创建一个符号链接/etc/rc.d/S。