如何在Ubuntu 16.10上启动时执行命令(rc.local alternative)
我在运行Ubuntu 16.10的Linode服务器上设置配额,我收到以下错误
无法stat()挂载设备/ dev / root:没有这样的文件或目录
所以为了解决这个问题,我通过添加完成了修复程序
ln -s /dev/xvda /dev/root /etc/init.d/quota restart
到/etc/rc.local
。 但是Ubuntu 16.10不再使用rc.local
而是使用systemd 。 rc.local
的替代方法是rc.local
,如何在启动时运行上述命令?
我也使用systemctl enable rc-local.service
启用了该服务,但它对我不起作用。 任何领导将不胜感激。
介绍
我认为您不应该按照George的链接建议创建新服务。 rc-local.service
已存在于systemd中,服务文件表明rc.local
(如果存在且可执行) 会自动拉入multi-user.target
。 因此,无需重新创建或强制使用systemd-rc-local-generator
以其他方式完成的操作。
一个解决方案
一个快速的解决方法(我不知道这是否是规范的方式):
在终端做:
printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local sudo chmod +x /etc/rc.local sudo reboot
之后,将在系统启动时调用rc.local
。 插入你想要的。
背景
如果你在终端做:
sudo systemctl edit --full rc-local
您可以看到头部注释包含以下行:
# This unit gets pulled automatically into multi-user.target by # systemd-rc-local-generator if /etc/rc.local is executable.
这表明,在这个系统中,如果有一个名为/etc/rc.local
的文件是可执行的,那么它将被自动拉入multi-user.target。 所以你只需创建相应的文件( sudo touch...
)并使其可执行( sudo chmod +x ...
)。
我看到这个解决方案建议涉及到使用systemd
:
-
创建服务:
sudo vi /etc/systemd/system/rc-local.service
-
在那里添加你的代码:
[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target
-
创建并确保
/etc/rc.local
是可执行的,并在其中添加此代码:sudo chmod +x /etc/rc.local
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. exit 0
-
启用服务:
sudo systemctl enable rc-local
-
启动服务并检查状态:
sudo systemctl start rc-local.service sudo systemctl status rc-local.service
-
如果一切顺利,您可以将
code
添加到/etc/rc.local
文件,然后重新启动它。
注意:在Lubuntu 16.10上测试过。
资源:
https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd
要添加Jan的答案 ,与通常的rc.local
文件不同, rc-local service
不会在所有服务启动后执行,而是在网络上线后执行。
在某些情况下,您可能希望稍后从rc.local
运行命令。 例如,我希望它在lxd
启动后执行。
在这种情况下,您可以通过创建一个drop-in conf文件来编辑rc-local service
启动依赖项: /etc/systemd/system/rc-local.service.d/override.conf
其中包含以下内容:
[Unit] After=network.target lxd.service
在哪里可以添加所需的单位名称(比如我添加了lxd.service
)
在此之后不要忘记systemctl daemon-reload
。