1 Systemd 实现自启动
对于那些支持 Systemd
的软件,安装的时候,会自动在 /usr/lib/systemd/system
目录添加一个配置文件如 *.service
。
在 《Linux入门笔记(系统服务)》 文章中设置某个 service
开机自动执行,就会使用到诸如以下命令:
systemctl enable httpd
这个命令相当于在 /etc/systemd/system
目录添加一个符号链接,指向 /usr/lib/systemd/system
里面的 httpd.service
文件。这是因为开机时,Systemd
只执行 /etc/systemd/system
目录里面的配置文件。这也意味着,如果把修改后的配置文件放在该目录,就可以达到覆盖原始配置的效果。
所以我们在自定义添加 service
文件的时候,可以直接在 /lib/systemd/system/
创建 serivice
文件。
1.1 编写 Service
在 /usr/lib/systemd/system
创建名为 zookeeper.service
的文件,内容如下:
[Unit]Description=Zookeeper ServiceAfter=network.target[Service]Type=forkingEnvironment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/redis/bin:/root/bin"User=rootGroup=rootExecStart=/usr/local/zookeeper-3.4.6/bin/zkServer.sh start /usr/local/zookeeper-3.4.6/conf/zoo.cfgExecStop=/usr/local/zookeeper-3.4.6/bin/zkServer.sh stopRestart=on-failure[Install]WantedBy=multi-user.target
各个定义解析如下:
- 定义控制单元
[Unit]
Description
:代表整个单元的描述,可根据需要任意填写。After
:指定启动顺序。上例子就表明如果network.target
需要启动,那么zookeeper.service
应该在它们之后启动。Before
:同理,但注意,After
和Before
字段只涉及启动顺序,不涉及依赖关系。Wants
:如果上面例子添加了Wants
字段,则表示network.target
与zookeeper.service
之间存在”弱依赖”关系,即如果network.target
启动失败或停止运行,不影响zookeeper.service
继续执行。(注:只表示依赖关系,与启动顺序无关,默认情况下是同时启动的)Requires
:则表示强依赖关系,即如果network.target
启动失败或异常退出,那么zookeeper.service
也必须退出。(注:只表示依赖关系,与启动顺序无关,默认情况下是同时启动的)
- 定义服务本体
[service]
Type
:服务的类型,各种类型的区别如下所示simple
:默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出,那么就认为服务退出了。forking
:如果ExecStart
程序启动后会通过fork
系统调用创建子进程,然后关闭应用程序本身进程的情况,则应该将Type
的值设置为forking
,否则systemd
将不会跟踪子进程的行为,而认为服务已经退出,上面zookeeper.service
则就是这个例子oneshot
:适用于那些被一次性执行的任务或者命令,它运行完成后便了无痕迹。因为这类服务运行完就没有任何痕迹,我们经常会需要使用RemainAfterExit=yes
。意思是说,即使没有进程存在,Systemd
也认为该服务启动成功了。同时只有这种类型支持多条命令,命令之间用;
分割,如需换行可以用\
。dbus
:这个程序启动时需要获取一块DBus
空间,所以需要和BusName
一起用。只有它成功获得了DBus
空间,依赖它的程序才会被启动。
Environment
:指定环境变量EnvironmentFile
:指定当前服务的环境参数文件。该文件内部的key=value
键值对。指定后,可以用$key
的形式,在当前配置文件中获取,如在ExecStart
定义命令/usr/sbin/sshd -D $OPTIONS
,其中变量$OPTIONS
就来自指定的环境参数文件中。User
:指定用户运行Group
:指定用户组运行WorkingDirectory
:进程工作目录,也就是说在执行前会先切换到这个目录ExecStart
:定义启动进程时执行的命令(必须要有)ExecStop
:停止服务时执行的命令(必须要有)ExecReload
:重启服务时执行的命令(不是必须)ExecStartPre
:启动服务之前执行的命令(不是必须)ExecStartPost
:启动服务之后执行的命令(不是必须)ExecStopPost
:停止服务之后执行的命令(不是必须)Restart
:定义何种情况Systemd
会自动重启当前服务,值包括no
(默认值):退出后不会重启on-success
:只有正常退出时(退出状态码为0),才会重启on-failure
:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启on-abnormal
:只有被信号终止和超时,才会重启on-abort
:只有在收到没有捕捉到的信号终止时,才会重启on-watchdog
:超时退出,才会重启always
:不管是什么退出原因,总是重启
- 安装服务
[install]
:通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动WantedBy
:设置服务被谁装载,一般设置为multi-user.target
在 /usr/lib/systemd/system
创建名为 kafka.service
的文件,内容如下:
[Unit]Description=Apache Kafka Server (broker)After=network.targetzookeeper.service[Service]Type=simpleEnvironment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/redis/bin:/root/bin"User=rootGroup=rootExecStart=/usr/local/kafka_2.12/bin/kafka-server-start.sh /usr/local/kafka_2.12/config/server.propertiesExecStop=/usr/local/kafka_2.12/bin/kafka-server-stop.shRestart=on-failure[Install]WantedBy=multi-user.target
1.2 启动服务
# 刷新配置(必须先执行)systemctl daemon-reload#服务加入开机自启systemctl enable zookeeper.servicesystemctl enable kafka.service#启动kafka前必须先启动zookeepersystemctl start zookeepersystemctl start kafka#查看状态systemctl status zookeepersystemctl status kafka
2 修改开机启动文件实现自启动
/etc/rc.d/rc.local
文件会在 Linux 系统各项服务都启动完毕之后再被运行。所以你想要自己的脚本在开机后被运行的话,可以将自己脚本路径加到该文件里。
但是,首先需要确认你有运行这个文件的权限。
chmod +x /etc/rc.d/rc.local
以下是测试脚本 /home/ok/auto_run_script.sh
#!/bin/bash date >> /home/ok/output.txthostname >> /home/ok/output.txt
保存退出后,再给它赋予可执行权限:
chmod +x auto_run_script.sh
最后修改 /etc/rc.d/rc.local
文件,在结尾添加以下语句:
/home/ok/auto_run_script.sh
注:
/etc/rc.local
是/etc/rc.d/rc.local
的软连接,所以修改/etc/rc.local
也可以达到相同效果
3 crontab
实现自启动
在 《Linux入门笔记(计划任务)》 这篇文章就学习过 crontab
,crontab
是 Linux 下的计划任务,我们可以自己设置计划任务时间,然后编写对应的脚本。但是,有个特殊的任务,叫作 @reboot
,我们其实也可以直接从它的字面意义看出来,这个任务就是在系统重启之后自动运行某个脚本。
输入以下命令进入计划任务设计
crontab -e
添加以下命令行,实现脚本自启动
@reboot /home/ok/auto_run_script.sh
4 /etc/profile.d/
下实现自启动
系统启动后就会自动执行 /etc/profile.d/
目录下的所有 ·shell
脚本,将写好的脚本(.sh
文件)放到目录 /etc/profile.d/
下,从而实现脚本自启动。
5 chkconfig
实现自启动
在了解 chkconfig
之前,先了解 Linux 运行级别
5.1 Linux 运行级别
0
:系统停机状态,系统默认运行级别不能设置为0
,否则不能正常启动,机器关闭。1
:单用户工作状态,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登录。2
:多用户状态,没有NFS支持。3
:完整的多用户模式,有NFS,登陆后进入控制台命令行模式。4
:系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。5
:登陆后进入图形GUI模式,XWindow系统。6
:系统正常关闭并重启,默认运行级别不能设为6
,否则不能正常启动。运行init 6
机器就会重启。
标准的Linux运行级别为 3
或 5
,如果是 3
的话,系统就在多用户状态;如果是 5
的话,则是运行着X Window系统。
5.2 chkconfig
chkconfig
命令可以用来检查、设置系统的各种服务。
通过将编写好的脚本放置到 /etc/init.d/
或者 /etc/rc.d/init.d/
(前者是后者的软连接),此时脚本文件也要稍作修改:
#!/bin/sh#chkconfig: 35 20 80#description: 自己随便发挥!!!,此行代码必须date >> /home/ok/output.txthostname >> /home/ok/output.txt
然后添加脚本执行权限
chmod +x /etc/init.d/auto_run_script.sh
其中 #chkconfig: 数字1 数字2 数字3
这句语句代表的是:
数字1
:表示运行级别,如35
则表示在完整的多用户模式
及图形GUI模式
启动这个服务数字2
:启动优先级数字3
:关闭优先级
添加脚本到开机自动启动项目中。添加到 chkconfig
,开机自启动。
cd /etc/rc.d/init.dchkconfig --add auto_run_script.shchkconfig auto_run_script.sh on
关闭开机启动:
chkconfig auto_run_script.sh off
从 chkconfig
管理中删除 auto_run_script.sh
chkconfig --del auto_run_script.sh
查看 chkconfig
管理
chkconfig --list auto_run_script.sh