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:同理,但注意,AfterBefore 字段只涉及启动顺序,不涉及依赖关系。
    • Wants:如果上面例子添加了 Wants 字段,则表示 network.targetzookeeper.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入门笔记(计划任务)》 这篇文章就学习过 crontabcrontab 是 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运行级别为 35,如果是 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