ubuntu设置开机启动一般有如下几种方法

1、修改/etc/rc.local

早期的系统直接编辑/etc/rc.local文件,在exit之前加入执行的命令即可实现开机自启。但是这种方法目前已不被推荐,最新的ubuntu18以及ubuntu20已经没有该文件。

2、增加/etc/init/xxx.conf

进入/etc/init目录,我们会发现该目录下有很多类似的xxx.conf文件。通过在该目录下新增conf文件同样可以实现开机自启的功能,之前我在ubuntu14系统通过该方式实现x11vnc的开机自启。但是这种方法目前同样不被推荐,一般在ubuntu16之后的系统同样不推荐使用这样的方法。

3、增加/lib/systemd/system/xxx.service

进入/lib/systemd/system目录,我们会发现该目录下有很多类似的xxx.service文件。通过在该目录下新增service文件并搭配最新的systemctl命令,可以实现开机自启、启动、关闭服务等功能。该方法同样适用于centos。

4、桌面环境gnome-session-properties设置

如果有ubuntu桌面环境,通过在终端输入gnome-session-properties会弹出如下设置启动项的页面:

ubuntubios设置来电自动开机 ubuntu设置开机自动启动_ubuntubios设置来电自动开机

点击Add按钮,在弹出的界面中Command对应的部分选择自己的启动脚本即可

5、增加~/.config/autostart/xxx.sh.desktop

该方法实际上和方法4一样,只是方法4需要桌面环境,如果你只能通过ssh连接设备的话,那么方法4就无法操作。方法5即是方法4的替代方案。

进入~/.config/autostart目录,我们我们会发现该目录下有很多类似的xxx.sh.desktop文件。通过在该目录下新增desktop文件可以实现开机自启的功能。

6、示例

6.1在ubuntu14通过/etc/init/x11vnc.conf实现x11vnc开机自启

在ubuntu14上安装x11vnc,设置开机启动的方法如下:

  1. 创建/etc/init/x11vnc.conf文件
  2. 写入以下内容:

 

start on login-session-start
     script
     /usr/bin/x11vnc -auth /var/run/lightdm/root/:0 -noxrecord -noxfixes -noxdamage -rfbauth /etc/x11vnc.pass -forever -bg -rfbport   5900 -o /var/log/x11vnc.log
    end script

设置完成后,重启机器发现x11vnc实现了开机启动。

6.2在ubuntu16通过/lib/systemd/system实现x11vnc开机自启

最近我在一台ubuntu16的机器上使用了6.1的方法,但是发现x11vnc并没有开机启动,手动执行该脚本发现可以正常启动x11vnc。

在读了一些资料后,发现在ubuntu16设置开机启动方法为:在/lib/systemd/system目录下新建x11vnc.service,写入一下内容

[Unit]
 Description=Start x11vnc at startup.
 After=multi-user.target
 [Service]
 Type=simple
 ExecStart=/usr/bin/x11vnc -auth guess -forever -loop -noxdamage -repeat -rfbauth /etc/x11vnc.pass -rfbport 5900 -shared
 [Install]
 WantedBy=multi-user.target

然后执行以下命令启动x11vnc

sudo systemctl daemon-reload

sudo systemctl enable x11vnc.service

sudo systemctl start x11vnc.service

6.3在ubuntu16通过/lib/systemd/system实现srs开机自启

有了上面设置x11vnc开机启动的经验,在设置srs开机启动上仍然遇到了一些问题。首先,ExecStart只能使用一条命令,而srs的启动需要切换到某一路径,以相对路径启动,不然程序会报错。这个可以通过将命令封装成shell脚本,然后在ExecStart后面执行shell脚本来实现。后面再启动srs时发现程序启动后就退出了,但是手动执行该shell脚本没有问题。通过比较发现,以service执行时,会打印父进程退出,而手动执行时打印父进程退出,子进程启动。问题出在这个地方。将之前写的srs.service里面的Type=simple改成Type=forking后,srs完成了开机自启动。