init 进程
- init 进程是所有 Linux 进程的父进程,进程号为 1.
Linux 系统运行中,init 程序是最基本的程序之一。
好的 Linux 发行版通常带有 init 配置,该配置可以适用于绝大多数系统工作,此系统中不需要对 init 做如何处理。
仅在遇到串行终端挂住、拨入调制解调器、或者希望改变缺省的运行级别是才需要关心 init
init 进程的实现
OpenRC:它是一个基于依赖的 init 系统,它用 C 语言和遵循 POSIX 的 shell 写成,这使得它在 BSD 和 Linux 上可以使用。
Systemd:它是一套中央化系统及设置管理程序。包括守护进程,程序库以及应用软件。
Upstart:是一个基于事件的 init 程序,用于代替传统的 init (多种类 Unix 计算机操作系统启动时用于执行任务的程序)。
Sysvinit:是 system V 风格的 init 系统,源于 System V 系列 UNIX,提供比 BSD 风格 init 系统广告的灵活性。是已经风行几十年的 UNIX init 系统,一直被各类 Linux 发行版采用。
Systemd
Systemd 定义
systemd 服务是一种以 .service 结尾的单元(unit)配置文件,用于控制由 Systemd 控制或者监视的进程。用于后台守护精灵(deamon)的形式运行进程。
Systemd 广泛应用于新版本的 RHELSUSE Linux EnterpriseCentOSFedora 和 openSUSE,用于代替就有的服务器 service。
Systemd 常用命令
systemctl command xxx.service
command 可以是:start、stop、enable
systemctl start httpd.service #启动 Apache 服务systemctl stop httpd.service #停止 Apache 服务systemctl restart httpd.service #重启 Apache 服务systemctl enable mariabd.service # 将 MariaDB 服务设置为开机状态
查看系统已有 Systemd 配置文件
Systemd 的配置文件都放置在 /etc/systemd/system 目录下
典型的 systemd 配置文件包含三个单元
[Unit] :此项目与 unit 的解释、执行服务相依赖性有关
Description=OpenBSD Secure Shell serverDocumentat ion=man:sshd(8) man:sshd_ config(5)After=network. target auditd. serviceConditionPathExists=!/etc/ssh/sshd_ not_ to_ be_ run``
[Service] :该项目与实际执行的指令参数有关
EnvironmentFile=- -/etc/default/sshExecStartPre=/usr/sbin/sshd -tExecStart=/usr/sbin/sshd -D $SSHD_ OPTSExecReload=/us r/sbin/sshd-tExecReload=/bin/kill -HUP $MAINPIDKillMode=processRestart=on-failureRestartPreventExitStatus=255Typе =notifyRunt imeDirectory=sshdRuntimeDirectoryMode=0755
[Install] :此项目说明此 unit 要挂载 target 下面 WantedBy=multi -user. targetAlias. Service
Systemd 的 Unit 在 Systemd 中,所有引导过程中 Systemd 要控制的东西都是一个单元。基本的用法:
- Description:代表了整个单元描述,可根据需要任意填写。
- Wants:本单元启动了,它“想要”的单元会被启动。但是这个单元启动若不成功,对本单元没有影响。
- Requires:该单元启动了,则它“需要”的单元也会被启动。它“需要”的单元被停止了,但是这个设定并不能控制启动顺序,因为它“需要”的单元启动也需要时间,若他需要的单元还未完全启动,就开始启动本单元,则本单元也无法启动,故不建议使用该字段。
- OnFailure:若本单元启动失败了,顺推,启动该单元作为折衷。
- Before/After :指定启动顺序。
Systemd 的 Service 服务本体,基本用法如下:
- Type:服务的类型,各种类型去呗如下:simple:默认,最简单的服务类型。说启动的程序就是说启动的就是主体程序,这个程序要是退出那么一切皆无。
- forking:标准 Unix Daemon 使用的启动方式。
启动程序后会调用 fork0 函数,把必要的通信频道都设置好后父进程退出,留下守护精灵的子进程。
- oneshot:适用于那些被一次性执行的任务或者命令,它运行完成后就消失。因为这类服务运行完成就没有任何痕迹,我们经常会需要使用 RemainAfterExit = yes。即使没有进程存在,Systemd 也认为该服务启动成功了。
同时只有这种类型支持多条命令,命令之间用 “ ; ”分割,如需要换行使用“ \ ”
- dbus:这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName = 一起用。只有它成功获得了 DBus 空间,依赖他的程序才会被启动。
- ExecStart:在输入的命令是 start 时候执行的命令,这里启动的程序必须使用绝对路径。如必须使用 /sbin/arp 而不能简单的以环境变量直接使用 arp。
- ExeStop:在输入命令是 stop 时候执行的命令,要求同上。ExecReload:这个不是必须,如果不写则 Service 就不支持 restart 命令。ExeStart 和 ExecStop 是必须要有的。
Systemd 的 Install
服务编写完后还需要被 systemd 装在定义安装各个单元各个字段:
- WantedBy:设置服务被谁装载,一般设置为multi-user.target。
- Alias:为 service 设置一个别名,可以使用多个名字来操作服务。
-
编写一个简单的 Systemd 配置文件


Unit 部分
something 代表任何事物,任何内容,Wants 是服务启动成功时检查有遗漏启动,After 是指网络启动成功后执行。
- Service 部分
type 这个命令的执行完成,退出也认为服务是正常的,以及配置这个 remainafterexit,表示即建成退出也表示可以继续运行,另外两个就是最核心的 execstart 和 execstop 表示在启动的时候会执行 touch、tmp。
- Install 部分
Wantby 表示服务挂载载mulyi-user.target
crontab
crontab 基本介绍
crontab 是用来定期执行程序的命令,当安装完成操作系统后,默认便会启动此任务调度命令。
Crond 命令会子啊后台每分钟定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
常用命令
- crontab-l:列出当前的日程表
- crontab-e:编辑当前的日程表
- crontab-r:删除当前日程表
-
crontab 语法
crontab 作为一个定时任务调度程序,就存在定时任务调度语法,实际使用过程中,语法是以定义分钟、小一个月中的几天、月份、星期,并且附上对应的命令(program)来完成对应对的定义。
若在分钟中定义的是 0,在小时中定义的是 0,在一个月中的第几天定义的是 1,在月份中也是定义 1,在星期中定义 * (代表所有可能的值),最后输入一个 echo hello ,代表着在 1 月份的 0 时 0 分 去执行 echo hello。常用语法
星号( * ):代表所有可能的值,例如 mouth 字段带星号,则表示在满足其他字段的执行该命令操作。
- 都好( , ): 可以用逗号隔开的值指定一个范围的列表。
- 中杠( - ):可以用整数之间的中杠表示一个整数范围。
- 正斜线( / ):可以用正斜线指定时间间隔的间隔频率。例如“2-6/2 ”表示每两个小时执行一次。同时正斜线可以和星号一起使用,例如用 */10 ,表示 minute 字段,表示每十分钟执行一次。
实际使用中编辑 crontab
登陆后,看不见 crontab 列表,执行 crontab-l 来查看调度表,此时显示当前用户没有 crontab 任务,使用 crontab-e 进入编辑模式,当定义任务时,使用 * 表示任意时间任意……,五个星号表示任意时间都要执行。然后执行命令:echo”123/r/n” >> /tmp/crontabtest (输出 tmp 目录下的crontabltest 文件),然后保存并且退出,此时会在 tmp 目录下出现一个对应的生成文件,这是可以使用 crontab-l 查看我们的服务。
实际使用时,可以根据需要调整实际效果,或着使用 ls/tmp ,目前目录未使用定时任务,此时可以使用 systemctl statsus crond.service,可以看到服务器的运行状况,重启服务之后,看 tmp 目录,就可以看到 crontabtest。
查看 crontabtest 文件,显示刚刚输入的信息,此时 crontab 就已经执行成功,在输入 crontab-l 显示命令。用 crontab-r 清空,重新输入 crontab-l,发现任务已经被清除。
crontab 常用工具
使用 crontab guru 工具快速理解 crontab 的语法。
crontab 规避
- 新建 cron 任务不会马上执行,至少需要两分钟。也可以重启 cron 马上执行。
- crontab 命令需要写成绝对路径
crontab 有一个加载机会,编写的命令需要加载到 crontab 的整个进程当中,需要等下一次执行的时候才能加载进去。 绝对路径是因为 crontab 有自己的用户信息,与所配置的用户信息不符合,就会无法执行,所以写成绝对路径,确保命令可以被执行。
Supervisord
Supervisord
Supervisord 是用 Python 开发的一套通用的进程管理系统,就能一个普通命令进程变为后台 daemon,并且监控进程状态,异常退出时可以正常自动启动。
Supervisord 可以很方便的管理批量进程,不仅仅支持启动、重启、关闭、重载,还要支持监控进程,进程意外僵死后可以自动拉起,确保服务可以正常运行。
Supervisord 安装
yum install supervisord 安装 Supervisord
echosupervisord conf > /etc/supervisord. conf 生成 Supervisord 的配置文件
supervisird -c /etc/supervisord. conf 启动 Supervisord
启动成功后即可执行 Supervisord 的命令。
Supervisord 配置管理
Supervisord 的进程配置文件放置在 /etc/supervisord. conf:
[program:echo_hi]
command=echo hi >> /tmp/hi
autostart=true #是否自动启动
autorestart=true #是否可以重启动
startsecs=10 # 启动时长
starteries=3 #启动失败重试次数
exitcodes=0,2 #退出的代码
stopsignal=QUIT #退出时的信号
stopwaitsecs=10 #停止执行时的命令
log_stdout=true #是否记录标准输出
log_stderr=true #是否记录标准报错
logfile=/tep/show_hi.log #日志记录路径为show_hi.loglogfile=maxbytes=1MB #最大大小为1Mlogfile=backups=10 #备份最多保存10天stdout_logfile_maxbytes=20MB #标准输出大小为20Mstdout_logfile=/tmp/echo_hi. stdout.log #路径为echo_hi.stdout.log
真机查看 Supervisord
cat supervisord.conf 查看 Supervisord 配置文件
unix_http_server 是 Supervisord 提供的 unix 接口,可以通过这个接口对它执行操作。
若想自己编写程序控制 Supervisord,就可以通过接口文件来就行连接。
也可以用 http 连接
在未完全开启,后续大规模控制时可以通过在集群上配置 Supervisord 的 server 来完成具体的配置。
Supervisord 的具体控制

program 部分决定命令属性,包含命令、进程名、启动多少个进程、执行目录、默认的umask、优先级、是否需要自动重启、是否需要自动启动、启动时是否需要等待和重试、退出代码等
日志标准输出位置:
错误输出位置;
关键 :
Environment 设定环境变量,可以设定多个环境变量
