如何在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

  1. 创建服务:

     sudo vi /etc/systemd/system/rc-local.service 
  2. 在那里添加你的代码:

     [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 
  3. 创建并确保/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 
  4. 启用服务:

     sudo systemctl enable rc-local 
  5. 启动服务并检查状态:

     sudo systemctl start rc-local.service sudo systemctl status rc-local.service 
  6. 如果一切顺利,您可以将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