ubuntu 16.04LTS开机自启动(包括virtualenv、conda等虚拟环境)

    我们采用ubuntu做服务器时,总是有不少服务和环境需要开机让其自启动,那么怎么设置呢。

    一、如果ubuntu16安装的是Desktop版本,则有两种方式可以选择:

    ①ubuntu的桌面lightdm自带的Startup application Preference,不过这里我并没有测试成功,先挖一个坑。

    -------------------------------------------------------这是坑位--------------------------------------------------------

    ②设置rc.local开机启动命令/脚本的方法(通过update-rc.d管理Ubuntu开机启动程序/服务)

    rc.local脚本是一个Ubuntu开机后会自动执行的脚本,我们可以在该脚本内添加命令行指令。该脚本位于/etc/路径下,需要root权限才能修改。

    在终端敲击命令    sudo vim /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


####------------------------------------------------------------------------------------------------------ 

注意: 一定要将命令添加在exit 0之前。里面可以直接写命令或者执行Shell脚本文件sh。

        其中基于bash的source   bash等命令是不执行的。执行脚本可以直接写  . ./XXX.sh

 

        rc.local文件头部/bin/sh也可以修改为/bin/bash

        如果是执行sh文件,那么要赋予执行权限sudo chmod +x xxx.sh,然后启动时加上sudo sh xxx.sh

 

        python命令可以在XXX.py 文件后加上“&”,即   python XXX.py & 即启动服务成功后执行下一行命令,而不需要一直处于等待输入输出状态(这条是亲测摸索出来的心得)

 

有时候,由于很多个服务要都启动,但是每一个服务的环境不同,所以用virtualenv虚拟了环境后,是不是也是可以直接如此操作呢?

尝试后发现并不可以,原因是rc.local的启动次序非常靠前,这个时候虚拟环境的工具是还没有启动的,所以在shell文件中的相应的vistualenv的命令都是执行失败的,即使是在rc.local里采用了shell的sleep语句

--------------------------------------------------------------------------------

 

在有的shell(比如linux中的bash)中sleep还支持睡眠(分,小时)
sleep 1    睡眠1秒
sleep 1s    睡眠1秒
sleep 1m   睡眠1分
sleep 1h   睡眠1小时

---------------------------------------------------------------------------------

也仍然是失败的,所谓的sleep,因为在rc.local都是可直接执行的脚本,所以系统已经跑完,只是让结果延后一定时间输出而已。

那么该怎么办呢,其实解决方案十分简单,当时我是在rc.local中sleep了一分钟后执行了一个python文件,而该py文件中用os.system的语句再去执行一个sh文件,该sh文件启动了相应的virtualenv的环境,就解决了该问题,想来应该是shell不会去具体运行py中的os.system相对应的shell文件,而只是确定了开机后要执行该文件,即做一次python XXX.py操作,而这个环境在rc.local启动时是具备了的。那么这么已考虑,是否在rc.local中所谓的sleep都不需要去考虑了呢,果断删除该语句,直接运行py文件,仍旧成功,完美!

 

    二、如果ubuntu16安装的是无桌面版本,则直接采取上面的第二种方法即可。

 

另外:也可以自己新建启动脚本:

 

给Ubuntu添加一个开机启动脚本,操作如下:

1、新建个脚本文件new_service.sh

#!/bin/bash
# command content
  
exit 0

2、设置权限

sudo chmod 755 new_service.sh
#或者
sudo chmod +x new_service.sh

3、把脚本放置到启动目录下

sudo mv new_service.sh /etc/init.d/

4、将脚本添加到启动脚本

执行如下指令,在这里90表明一个优先级,越高表示执行的越晚

cd /etc/init.d/
sudo update-rc.d new_service.sh defaults 90

5、移除Ubuntu开机脚本

sudo update-rc.d -f new_service.sh remove

6、通过sysv-rc-conf来管理上面启动服务的启动级别等,还是开机不启动

sudo sysv-rc-conf 

7、update-rc.d的详细参数

使用update-rc.d命令需要指定脚本名称和一些参数,它的格式看起来是这样的(需要在 root 权限下):

update-rc.d [-n] [-f] <basename> remove
update-rc.d [-n] <basename> defaults
update-rc.d [-n] <basename> disable|enable [S|2|3|4|5]
update-rc.d <basename> start|stop <NN> <runlevels>
-n: not really
-f: force

其中:

  • disable|enable:代表脚本还在/etc/init.d中,并设置当前状态是手动启动还是自动启动。
  • start|stop:代表脚本还在/etc/init.d中,开机,并设置当前状态是开始运行还是停止运行。(启用后可配置开始运行与否)
  • NN:是一个决定启动顺序的两位数字值。(例如90大于80,因此80对应的脚本先启动或先停止)
  • runlevels:则指定了运行级别。

实例:

(1)、添加一个新的启动脚本sample_init_script,并且指定为默认启动顺序、默认运行级别(还记得前面说的吗,首先要有实际的文件存在于/etc/init.d,即若文件/etc/init.d/sample_init_script不存在,则该命令不会执行):

update-rc.d sample_init_script defaults

上一条命令等效于(中间是一个英文句点符号):

update-rc.d sample_init_script start 20 2 3 4 5 . stop 20 0 1 6

(2)、安装一个启动脚本sample_init_script,指定默认运行级别,但启动顺序为50:

update-rc.d sample_init_script defaults 50

(3)、安装两个启动脚本A、B,让A先于B启动,后于B停止:

update-rc.d A 10 40
update-rc.d B 20 30

(4)、删除一个启动脚本sample_init_script,如果脚本不存在则直接跳过:

update-rc.d -f sample_init_script remove

这一条命令实际上做的就是一一删除所有位于/etc/rcX.d目录下指向/etc/init.d中sample_init_script的链接(可能存在多个链接文件),update-rc.d只不过简化了这一步骤。

(5)禁止Apache/MySQL相关组件开机自启:

update-rc.d -f apache2 remove
update-rc.d -f mysql remove

8、服务的启动停止状态

#通过service,比如
sudo service xxx status
sudo service xxx start
sudo service xxx stop
sudo service xxx restart

9、查看全部服务列表

sudo service --status-all

 

 

 

 

 

 

 

 

 

上一篇:Ubuntu 提权漏洞(CVE-2019-7304)复现


下一篇:Win10(免激活纯净版)+Ubuntu18.0.4 LTS,双系统安装