CentOS6.x
CentOS6中转用Upstrat代替以前的init.d/rcX.d的线性启动方式。
一、相关命令
通过initctl help可以查看相关命令
[root@localhost ~]# initctl helpJob commands: start Start job. stop Stop job. restart Restart job. reload Send HUP signal to job. status Query status of job. list List known jobs.Event commands: emit Emit an event.Other commands: reload-configuration Reload the configuration of the init daemon. version Request the version of the init daemon. log-priority Change the minimum priority of log messages from the init daemon usage Show job usage message if available. help display list of commandsFor more information on a command, try `initctl COMMAND --help'.
二、自己配置一个
在/etc/init/文件夹中新建一个testserver.conf配置文件。
通过exec执行发布出来的程序可执行文件。通过设置respawn让程序反复启动。
start on runlevel [2345]stop on runlevel [!2345]
respawnexec /usr/local/src/testserver/testserver
然后启动
initctl reload-configuration initctl list initctl start testserver
通过initctl list即可看程序是不是处于running启动状态。
[root@localhost ~]# initctl listvmware-tools start/runningrc stop/waitingtty (/dev/tty3) start/running, process 3024tty (/dev/tty2) start/running, process 3022tty (/dev/tty6) start/running, process 3033tty (/dev/tty5) start/running, process 3028tty (/dev/tty4) start/running, process 3026plymouth-shutdown stop/waitingtestserver start/running, process 4157control-alt-delete stop/waitingrcS-emergency stop/waitingreadahead-collector stop/waitingkexec-disable stop/waitingquit-plymouth stop/waitingrcS stop/waitingprefdm start/running, process 3017init-system-dbus stop/waitingck-log-system-restart stop/waitingreadahead stop/waitingck-log-system-start stop/waitingsplash-manager stop/waitingstart-ttys stop/waitingreadahead-disable-services stop/waitingck-log-system-stop stop/waitingrcS-sulogin stop/waitingserial stop/waiting
可以看到其处于启动状态,现在守护进程已经设置成功。
另外,配置文件中可以通过script ... end script执行脚本。举个例子
start on runlevel [2345]stop on runlevel [!2345]script echo “test~~~~~” >>/tmp/test.txt end script
CentOS7.x
Centos7中可以通过systemd配置守护进程。
一、Unit的含义
systemd可以管理所有系统资源,不同资源统称为 Unit,一共分为12种:
Service unit: 系统服务Target unit: 多个unit构成一个组Device unit: 硬件设备Mount unit: 文件系统的挂载点Automount unit: 自动挂载点Path unit: 文件或路径Scope unit: 不是由Systemd启动的外部进程Slice unit: 进程组Snapshot unit: Systemd快照,可以切回某个快照Socket unit: 进程间通信的socketSwap unit: swap文件Timer unit: 定时器
二、Unit管理常用命令(主要针对service)
# 开机自启动systemctl enable nginx# 关闭自启动systemctl disable nginx# 服务状态systemctl status nginx# 服务重启systemctl restart nginx# 杀死一个服务systemctl kill nginx# 显示已启动的服务systemctl list-units --type=service
三、Unit配置文件
每一个Unit都有一个配置文件,用于告诉系统如何启动Unit,systemd默认从 /etc/systemd/system/ 目录读取配置文件,
Unit配置文件目录主要有三个:
/lib/systemd/system/run/systemd/system/etc/systemd/system
四、Unit服务配置
每个服务以.service后缀,一般会分为3部分:[Unit],[Service],[Install],具体以nginx服务为例:
[Unit]Description=nginx - high performance web serverAfter=network.target remote-fs.target nss-lookup.target [Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.confExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin/nginx -s stop #Restart配置可以在进程被kill掉之后,让systemctl产生新的进程,避免服务挂掉Restart=on-failureRestartSec=30 [Install]WantedBy=multi-user.target
1、[Unit]区块
[Unit]区块通常是配置文件的第一个区块,用来定义Unit的元数据,以及配置与其他Unit的关系。
Description: 简短描述Documentation: 文档地址After:依赖,仅当依赖的服务启动之后再启动自定义的服务单元
2、[Service]区块
[Service]区块用来Service的配置,只有service类型的unit才有本区块。
Type: 定义启动时的进程行为。它有以下几种值:
Type=simple :(默认值) systemd认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是 socket 激活型。Type=forking :systemd认为当该服务进程 fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。 使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的主进程。Type=oneshot :这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。Type=notify :与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。Type=dbus :若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd 认为服务就绪。Type=idle :systemd 会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似。
其他选项:
ExecStart: 启动服务的命令ExecStartPre: 启动服务之前执行的命令ExecStartPost: 启动服务之后执行的命令ExecReload: 重启服务执行时的命令ExecStop: 停止服务时执行的命令ExecStopPost: 停止服务之后执行的命令RestartSec: 自动重启服务间隔的秒数Restart: 定义何种情况下会自动重启服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdogTimeoutSec: 定义Systemd停止服务之前等待的秒数Environment: 指定环境变量PIDFile: pid文件路径PrivateTmp: true表示给服务分配独立的临时空间User: 执行命令的用户Group: 执行命令的组
3、[Install]区块
[Install]区块用来定义如何启动,以及是否开机启动。
WantedBy: 它的值是一个或多个Target,当前Unit激活时(enable)符号链接会放入/etc/systemd/system目录下面以Target名 + .wants后缀构成的子目录中RequiredBy: 它的值是一个或多个Target,当前Unit激活时(enable)符号链接会放入/etc/systemd/system目录下面以Target名 + .required后缀构成的子目录中Alias: 当前Unit可用于启动的别名Also: 当前Unit激活时(enable),会被同时激活的其他Unit
五、Target的概念
Target就是一个Unit组,包含许多相关Unit。启动某个Target的时候,Systemd就会启动里面所有的Unit。
传统init启动模式里面,有RunLevel的概念,跟Target的作用很类似。不同的是,RunLevel是互斥的,不可能多个RunLevel同时启动,但是多个Target可以同时启动。
Target的常用命令:
查看所有target下的unitsystemctl list-unit-files --type=target 查看默认target,即默认的运行级别。对应于旧的`runlevel`命令systemctl get-default 设置默认的targetsystemctl set-default multi-user.target 查看target下的unitsystemctl list-dependencies multi-user.target 切换target,不属于新target的unit都会被停止systemctl isolate multi-user.target
六、自己配置一个
/lib/systemd/system/目录中定义一个自己的testserver.service文件
[Unit]Description=testserver[Service]# 应用程序所在的文件目录WorkingDirectory=/usr/local/src/testserver/ExecStart=/usr/local/src/testserver/testserverRestart=always# 如果服务崩溃,10秒后重新启动服务RestartSec=10KillSignal=SIGINTSyslogIdentifier=testserverUser=root# Production:生产环境 Development:开发环境# Environment=ASPNETCORE_ENVIRONMENT=Development[Install]WantedBy=multi-user.target # 由此target触发自启动
通过以下命令实现启动
systemctl daemon-reload // 自动启动systemctl enable testserver.service //立即启动systemctl start testserver.service //状态查看systemctl status testserver.service
部分摘自