Systemd 服务管理器

时间:2023-02-09 03:36:58

博文链接:http://www.cnblogs.com/zhenghongxin/p/8672199.html

项目中遇到有些脚本需要通过后台进程运行,保证不被异常中断,变成守护进程的第一步,就是把它改成"后台任务"(background job)。传统上我们是用以下的方法来做:

&

只要在命令的尾部加上符号&,启动的进程就会成为"后台任务"。

php index.php &

"后台任务"有两个特点。

  1. 继承当前 session (对话)的标准输出(stdout)和标准错误(stderr)。因此,后台任务的所有输出依然会同步地在命令行下显示。

  2. 不再继承当前 session 的标准输入(stdin)。你无法向这个任务输入指令了。如果它试图读取标准输入,就会暂停执行(halt)。

nohup

nohup 的用途就是让提交的命令忽略 hangup 信号。只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。

[root@VM_113_168_centos www]# nohup php index.php &
[2] 26047
[1]   Terminated              nohup php index.php
[root@VM_113_168_centos www]# nohup: ignoring input and appending output to ‘nohup.out’

nohup做了三件事:

  • 阻止SIGHUP信号发到这个进程。

  • 关闭标准输入。该进程不再能够接收任何输入,即使运行在前台。

  • 重定向标准输出和标准错误到文件nohup.out。

setsid

setsid中的sid指的是session id,意指以该命令运行的进程是一个新的session,因此其父进程id不属于当前终端。实际上,setsid运行的进程,其父进程id(PPID)为1(init 进程的 PID)。

[root@VM_113_168_centos www]# setsid php index.php

disown 和 screen等

还有其他方法诸如disown和screen等方法,在此不做多列举

Systemd

systemd的目标是:尽可能启动更少进程;尽可能将更多进程并行启动。systemd尽可能减少对shell脚本的依赖。传统sysvinit使用inittab来决定运行哪些shell脚本,大量使用shell脚本被认为是效率低下无法并行的原因

下面的命令用来启动服务。

$ sudo /etc/init.d/apache2 start # 或者 $ service apache2 start

这种方法有两个缺点。

一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。

二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

Systemd 命令

# 重启系统 $ sudo systemctl reboot # 关闭系统,切断电源 $ sudo systemctl poweroff # CPU停止工作 $ sudo systemctl halt # 暂停系统 $ sudo systemctl suspend # 让系统进入冬眠状态 $ sudo systemctl hibernate # 让系统进入交互式休眠状态 $ sudo systemctl hybrid-sleep # 启动进入救援状态(单用户状态) $ sudo systemctl rescue

诸如此类的命令还有很多,也正是它超高的管理,导致了各种争论,个人建议用Supervisor,也是我们生产环境所用的

在原始的时候,我们用的也是systemd,在一次升级之后,改用了swoole来做守护进程,再后续的升级中,改成了Supervisor来做守护进程,想要学习systemd的,可以看以下资料:

1 Systemd 入门教程:命令篇

http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

2 Systemd 入门教程:实战篇

http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

3 Systemd 中文手册

http://www.jinbuguo.com/systemd/systemd.html