如何配置一个服务在启动时运行

我有一个守护进程,如果我使用service命令手动启动它,它可以正常运行:

ricardo@ricardo-laptop:~$ sudo service minidlna start                   
 * Starting minidlna minidlna                                                              [ OK ] 

但它并没有配置为在计算机重新启动时自动启动。
我该如何设置它以实现自动启动,即使没有人登录计算机?

@user154721 你给 update-rc.d 提供了哪些参数来使自动启动工作? 我尝试了各种选项,但都没有成功。 - Vilāsamuni
自启动程序配置在autostart清单或*.service文件中的多个位置,还包括init.dcrontab。请参阅:https://unix.stackexchange.com/a/525845/43233 - Noam Manos
5个回答

sudo update-rc.d minidlna defaults

这应该将服务添加到自动启动系统中。但是如果你遇到:
System start/stop links for /etc/init.d/minidlna already exist.

执行指令

sudo update-rc.d minidlna enable

P.S.: 如需进一步了解,请查看使用命令man update-rc.d的手册页。


7谢谢,但是如果我运行该命令时得到这个输出怎么办呢?:/etc/init.d/minidlna的系统启动/停止链接已经存在。 - Ricardo Reyes
我在/var/log目录下的所有文件中使用grep命令搜索minidlna,但是没有找到任何关于该服务在启动时的提及。 - Ricardo Reyes
1如果Minidlna没有写入任何日志文件,你将无法找到它的任何地方。它可能失败是因为在启动时没有网络连接吗?尝试查看配置,如果可能的话打开调试和/或日志记录来找出问题所在。 - LassePoulsen
8@RicardoReyes 使用 sudo update-rc.d -f minidlna remove 命令来移除现有的链接。 - Dogweather
5我遇到了以下错误 update-rc.d:/etc/init.d/usermanage:文件不存在 - Rizwan Patel
还遇到了和@RizwanPatel一样的错误。 - Brian Leishman
6我也遇到了同样的错误update-rc.d: /etc/init.d/mongod: file does not exist。然后,对我来说,sudo systemctl enable mongod.service起作用了。 - explorer

自从Ubuntu 15.10及更高版本(或Debian 8 "jessie"及更高版本)以来,您需要使用以下命令来配置您的服务minidlna在启动时运行:
sudo systemctl enable minidlna.service

并且要再次禁用它在启动时自动运行:
sudo systemctl disable minidlna.service

这适用于您系统上可用的所有服务名称。要找出可用的服务名称,只需列出服务文件的文件名即可:
ls /lib/systemd/system/*.service
ls /etc/systemd/system/*.service

1关于sudo,我收到了“未知操作enable。”如果我放弃使用sudo,它会问我要选择哪个用户。选择您的root用户,然后您就可以设置所需的值。 - Cutton Eye
@tanius 我已经按照将新服务添加到/etc/systemd/system/*.service的步骤进行操作。我想知道为什么没有人建议创建或编辑这些文件,因为它们似乎提供了更多选项(如Restart、RestartSec、ExecStop等)。 - tiagoams
@tiagoams 在这里并不是在讨论创建一个服务文件的问题,因为原帖中已经提到了一个名为“minidlna”的服务已经存在,只是没有自动启动。但是感谢你提供了关于/etc目录下服务文件的提示,我现在已经将它添加到回答中了。 - tanius

  • 在启动时启动守护进程:

    update-rc.d service_name defaults
    
  • 要移除守护进程:

    update-rc.d -f service_name remove
    

默认值 => 默认运行级别为2、3、4和5

示例:

update-rc.d tomcat7 defaults

2当我执行此命令时,会出现“/etc/init.d/tomcat7的系统启动/停止链接已存在”的提示。然而,当我重新启动时,它并不会启动tomcat,我总是需要执行“service tomcat7 start”命令。 - John Little
在我的情况下,sudo update-rc.d myservice 默认情况下始终没有输出,并且服务不会在启动时启动,也无法通过 sudo service myservice start 来启动(这也是无声的)。然而,sudo /etc/init.d/myservice start 是有效的。 - axk

有时候你需要在启动过程中运行一个脚本,比如在启动过程中运行一个iptables配置。这样你就不必每次重启都手动运行脚本。
在Ubuntu中,你可以通过将脚本添加到/etc/init.d/rc.local文件中,在启动过程中运行你的脚本。请参考以下步骤。
  1. 使用以下命令打开/etc/rc.local文件:

    vim /etc/rc.local
    
  2. 在那里添加您希望在启动过程中运行的脚本,例如:

    sh /home/ivan/iptables.sh 
    echo 'Iptable已配置!'
    
  3. 查看该文件中包含的注释,并确保最后有一个exit 0

  4. 保存文件。您的脚本将在启动过程中运行。


2在Ubuntu 12.04中,/etc/init.d/rc.local的注释中提到:“Short-Description: 如果存在,则运行/etc/rc.local”。所以,也许将脚本添加到/etc/rc.local会是一个更好的主意? - Sanghyun Lee
这种方法会向服务发出“关闭”命令,还是只在操作系统关机时终止进程? - Vadym Chekan
Vadim,rc.local只在启动时运行,关机时不会有任何成果。该过程很可能会被操作系统在关机时终止。 - Weboide
1FYI:rc.local与将其添加到init的区别在于,rc.local是在init启动序列的末尾执行,而不是作为其中的一部分执行。 - BobTuckerman

在Ubuntu 18.04 TLS版本中,我发现如果启动脚本中没有类似以下的特定注释块,update-rc.d命令无法正常工作:
### BEGIN INIT INFO
# Provides: myprogram
# Required-Start: $ local_fs $ remote_fs $ syslog $ network $ time
# Required-Stop: $ local_fs $ remote_fs $ syslog $ network
# Default-start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: myprogram some description
### END INIT INFO