如何在Ubuntu 16.10上的启动时执行命令(替代rc.local)


49

我正在运行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,如何在启动时运行上述命令?

我也使用启用了该服务,systemctl enable rc-local.service但对我不起作用。任何线索将不胜感激。


di您以root身份运行它,并且是否重新启动了系统?
乔治·乌德森

@George是的,我都做了
Saurabh Sharma


@George效果不佳
Saurabh Sharma

刚看到这个
骇客

Answers:


65

介绍

我认为您不应该按照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 ...)。


4
不过不要使用#!/bin/bash#!/bin/sh除非您确实需要在脚本中使用bash。出于性能原因,所有其他系统脚本都使用破折号而不是bash。
spikyjt

“无需重新创建或强制使用systemd-rc-local-generator以其他方式完成的操作” rc-local不允许在其他某个单元之后订购它,不是吗?
x-yuri

20

我看到了建议的解决方案,其中涉及到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


我做了所有步骤。我在touch "hello"之前有rc.local :exit 0。该服务似乎处于活动状态,但未在/ etc / dir中创建任何文件,在ubuntu 16.04阿拉伯语5.31
Danny182 '17

正如@Jan的回答所指出的那样,由于systemd已经支持rc.local,因此不必创建一个新的服务。
TommyPeanuts

谢谢youuuuuuuuuuuuuuuuuuuuu,这才行得通
GPrathap

2

为了补充Jan的答案,与通常的rc.local文件不同,rc-local service它不是在所有服务都启动后才执行,而是在网络上线之后执行。

在某些情况下,您可能希望rc.local稍后再运行命令。例如,我希望在lxd启动后执行它。

在这种情况下,您可以rc-local service通过创建一个/etc/systemd/system/rc-local.service.d/override.conf 包含内容的conf文件来编辑启动依赖关系 :

[Unit]
After=network.target lxd.service

您可以在其中添加所需的单位名称(如我添加的lxd.service

之后不要忘记systemctl daemon-reload


欢迎来到Ask Ubuntu!如果您想改善其他答案,请提出修改建议。如果您想提出部分替代方案,请重复或引用相同的部分(以防原始答案更改)并突出显示差异。无论如何,请勿创建新的不完整答案!谢谢。
David Foerster
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.