我们在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的启动脚本。

linux自启动c程序_启动程序另一个程序执行安装_启动程序linux命令

删掉时,使用: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]

启动程序linux命令_linux自启动c程序_启动程序另一个程序执行安装

#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 运行必须满足的条件,否则会报启动失败

启动程序linux命令_启动程序另一个程序执行安装_linux自启动c程序

关于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:重启当前服务时执行的命令

启动程序linux命令_启动程序另一个程序执行安装_linux自启动c程序

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:在模板单元文件中,这指定了如果在没有任何显式设置实例的情况下启用了模板,则应为哪个实例启用该单元。此选项在非模板单元文件中无效。指定的字符串必须可用作实例标识符。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复