我们在linux系统中常常须要将自己的程序或脚本开机自启动linux格式化命令,linux也提供了多种方式linux自启动c程序,这儿简单介绍下3种常用的技巧,详尽说明下linux下的service。
方式一:更改rc.local,手动启动脚本
Linux操作系统在启动时,会调用init进程,获取runlevel信息,执行对于runlevel下的脚本,启动各个服务;接着会执行/etc/rc.d/rc.local文件。
所以,假如我们有任何想要开机启动时须要进行的工作,都可以把它写入rc.local文件。
注意:并不是所linux系统都有此文件,自ubuntu16.10后,此文件就不存在了。
技巧二:将用户脚本添加到/etc/init.d中
这儿先简单介绍下流程:
编撰一个自定义的脚本,添加执行权限:比如chmod+xtest将文件装入/etc/init.d目录中,之后将脚本链接到开机运行序列中。
这儿我们可以自己立案率软链接,链接到不同runlevel的执行目录下:
比如runlevel3启动时,希望启动test.sh,则:ln–s/etc/init.d/test/etc/rc3.d/S95test
另外,我们也可以通过update-rc.d来辅助:
update-rc.dtestdefaults95
须要注意的是我们脚本可能须要在开头添加一些固定的文本:可以参看怎么写一个init.d的启动脚本。
删掉时,使用:update-rc.d–ftestremove
这样,在rc*.d下才会出现S9595test软链接了。
关于rc*.d下软链接的命名:
这种链接文件通常以K或S开头linux启动盘制作工具,其中K表示停止(Kill)一个服务,会向脚本传递stop参数;S表示启动(Start)一个服务,会向脚本传递start参数;所以她们可以指向同一个脚本文件,只是传递不同的参数,以形成不同执行结果。
SK前面会跟数字,表示脚本的执行次序linux自启动c程序,数字越小执行次序越靠前。
Ps:我在个别系统上测试时,发觉“update-rc.dtestdefaults95”设置启动次序95可能会失败,启动次序弄成了1,即:S0101test,这是须要注意的。
方式三:编撰一个service文件
自ubuntu16后,已不再使用initd管理系统,好多启动脚本以service的形式存在,所以service还是须要好好了解一番的。
通常service都储存于/lib/system/system目录下,以xxx.service命名,且内部采用统一的格式:
[Unit]
Description=xxxxxxxxxxxxxxxx #描述服务
After=network.target #用于指定服务启动的前置条件
Documentation= #帮助文件的地址,可缺省
[Service]

#Type= 启动时进程行为,比如设为:simple
#EnvironmentFile= 指定环境变量,不指定可以设为no
#User= 启动用户
#Group= 启动用户组
ExecStart= /usr/bin/test #服务启动命令,此项必填
ExecStop= /usr/bin/test #服务终止命令,可缺省
#Restart= 指定重启条件,比如设为:on-failure
#RestartSec= 自动重启当前服务的间隔秒数,比如设为:1s
[Install] #用来定义如何启动,以及是否开机启动。
WantedBy=multi-user.target #当服务开机启动后,会放入什么文件夹,影响启动顺序
以上是一个简单的服务文件,大致可以看出分为3各部份,下边对每位部份做进一步的解释:
【Unit】区块:
Description:简短描述
Documentation:文档地址,比如:http:\www.xxx.com
Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
单位文件可能还包含许多Condition…=和 Assert…=设置。在启动设备之前,systemd将验证指定条件是否正确。如果不是,则将跳过该单元的启动(几乎无提示):
Condition...:当前 Unit 运行必须满足的条件,否则不会运行
Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败
关于Condition的具体设置可以看文章前面给出的官方联接,上面有愈发详尽的说明。
【Service】区块
Type:定义启动时的进程行为。它有以下几种值:
Type=simple:默认值,执行ExecStart指定的命令,启动主进程
Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
Type=dbus:当前服务通过D-Bus启动
Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
Type=idle:若有其他任务执行完毕,当前服务才会运行
ExecStart:启动当前服务的命令
ExecStartPre:启动当前服务之前执行的命令
ExecStartPost:启动当前服务之后执行的命令
ExecReload:重启当前服务时执行的命令

ExecStop:停止当前服务时执行的命令
ExecStopPost:停止当其服务之后执行的命令
RestartSec:自动重启当前服务间隔的秒数
Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
【Install】区块
Alias:当前 Unit 可用于启动的别名
WantedBy/RequiredBy:可以多次使用此选项,也可以使用空格分隔的单位名称列表;
WantedBy:它的值是一个或多个 Target,当前Unit激活时(enable)符号链接会放入/etc/systemd/system目录下面,以Target名+.wants后缀构成的子目录中。
RequiredBy:它的值是一个或多个 Target,当前Unit激活时,符号链接会放入/etc/systemd/system目录下面以Target名+.required后缀构成的子目录中
Also:当前Unit激活(enable)时,会被同时激活的其他 Unit
DefaultInstance:在模板单元文件中,这指定了如果在没有任何显式设置实例的情况下启用了模板,则应为哪个实例启用该单元。此选项在非模板单元文件中无效。指定的字符串必须可用作实例标识符。