骆小刚:Linux后台服务启动方式systemd、daemon、nohup大比拼
作者简介
骆小刚,现就职于深圳市普康电子有限公司,高级软件工程师。负责arm下u-boot、kernel开发,APP框架搭建,底层软件开发,算法开发,性能优化等。对开源软件有浓厚兴趣。
本文主要用实例剖析systemd、daemon()、nohup启动服务的差异。
环境:ubuntu 1804 x86_64, linux 5.0, gcc 8.3.0
1. systemd启动服务
systemd是最新linux发行版管理后台的服务的默认形式,用以取代原有的init。
1.1 编写服务程序
vim simple-server.c
gcc simple-server.c -o simple-server
1.2 配置服务
编辑服务配置文件simple-server.service
vim simple-server.service
解析:
[Unit] :服务单元
Description:对该服务进行简单的描述
[Service]:服务运行时行为配置
ExecStart:程序的完整路径
Restart:重启配置,no、always、on-success、on-failure、on-abnormal、on-abort、on-watchdog
[Install]:安装配置
WantedBy:多用户等
其他配置选项请参考:
https://www.freedesktop.org/software/systemd/man/systemd.service.html
将配置拷贝到/lib/systemd/system/目录下:
sudo cp simple-server.service /lib/systemd/system/
1.3 启用服务
sudo systemctl enable simple-server
会创建一个指向配置文件/lib/systemd/system/simple-server.service的符号链接
/etc/systemd/system/multi-user.target.wants/simple-server.service
1.4 开启服务
sudo systemctl start simple-server
1.5 服务状态
1.5.1服务与终端的关系
pstree
可以看到systemd启动的服务直接是pid=1的systemd进程的子进程。
可以看到服务程序忽略了SIGPIPE信号。
服务没有控制终端(tty为“?”)。
1.5.3 服务的运行日志
sudo lsof -p 6213
用lsof可以看到服务的用户为root,当前目录和根目录都是“/”,输入被重定向到/dev/null,输出和出错被重定向到socket。
1.5.4 服务的运行状态
sudo systemctl status simple-server
我可以看到simple-server服务已经loaded,并且处于active状态。还可以看到PID、Tasks数量、服务管理日志等。
1.6 关闭服务
sudo systemctl stop simple-server
1.7 停用服务
sudo systemctl disable simple-server
2. daemon启动服务
2.1 编写代码
vim daemon.c
gcc daemon.c -o daemon
2.2 启动服务
./daemon
2.3 服务状态
2.3.1 服务与终端的关系
服务把自己设置为会话首领,父进程是当前用户级的systemd(subreaper ),完全脱离终端。
2.3.2 服务的信号处理
ps -C daemon s
没有屏蔽信号。
控制终端tty为“?”
2.3.3 服务的运行日志
当前目录和根目录都是“/”,用户为普通用户,输入、输出、出错都重定向到/dev/null
2.4 停止服务
killall daemon
3. nohup 启动服务
3.1 编写代码
vim nohup.c
gcc nohup.c -o nohup
3.2 启动服务
用nohup命令启动这个名字也叫nohup的程序
(注意后面一个nohup是上面写的那个很简单的程序的名字)
nohup ./nohup
3.3 服务状态
3.3.1服务与终端的关系
服务的父进程是启动该服务的bash,和bash在一个会话组。
3.3.2 服务的信号处理
普通用户,屏蔽SIGHUP信号,依赖终端bash。由于屏蔽了SIGHUP,终端关闭的时候,会忽略终端发送的SIGHUP信号,继续运行服务。
3.3.3服务的运行日志
输入被重定向到/dev/null,输出、出错为当前目录下的nohup.out,格式没有带时间,不便于分析问题。
3.4 服务关闭
killall nohup
4. 总结
4.1 后台运行服务的基本需求
基本需求:
脱离终端(终端关闭时,服务不能关闭)
处理输入、输出、出错描述符
4.1.1 systemd
自己本身就是一个init或者user级的subreaper;
系统级systemd启动的服务以root权限运行;
重定向输入到/dev/null,输出、出错通过socket发给系统日志模块。
4.1.2 daemon
通过fork后父进程exit,让子进程托孤给subreaper,实现在后台运行服务。
重定向输入、输出、出错到/dev/null.
源码参考:
https://github.com/lattera/glibc/blob/master/misc/daemon.c
4.1.3 nohup
通过忽略终端关闭时的广播信号SIGHUP,实现在后台运行服务。
重定向输入到/dev/null,输出、出错重定向到当前目录下的nohup.out文件,
4.2 后台运行服务的高级需求
高级需求:
方便分析问题的服务运行日志记录
服务管理的日志
异常退出时可以根据需要重新启动
daemon不能实现上面的高级需求。
nohup 只能记录服务运行时的输出和出错日志。
只有systemd能够实现上述所有需求。
默认的日志中增加了时间、用户名、服务名称、PID等,非常人性化。
还能看到服务运行异常退出的日志。
还能通过/lib/systemd/system/下的配置文件定制各种需求。
还有非常非常多强大的功能等着你去探索:
https://www.freedesktop.org/software/systemd/man/systemd.html
4.3 systemd是目前linux管理后台服务的主流方式
Linux阅码场原创精华文章汇总
更多精彩,尽在"Linux阅码场",扫描下方二维码关注
点一点右下角”在看”,为阅码场打Call~
骆小刚:Linux后台服务启动方式systemd、daemon、nohup大比拼相关推荐
- linux后台服务架构高性能设计之道
"N 高 N 可",高性能.高并发.高可用.高可靠.可扩展.可维护.可用性等是后台开发耳熟能详的词了,它们中有些词在大部分情况下表达相近意思.本序列文章旨在探讨和总结后台架构设计中 ...
- linux mysql 服务名,linux mysql服务启动命令
很多人不知道linux系统下该如何启动mysal服务,下面由学习啦小编为大家整理了linux系统下mysql的服务启动命令,希望能帮到大家! linux mysql的服务启动命令 1.linux my ...
- 【转】Linux Oracle服务启动停止脚本与开机自启动
在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设置相关参数,首先先介 ...
- Linux Oracle服务启动停止脚本与开机自启动[转]
在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设定相关参数,首先先介 ...
- Linux Oracle服务启动停止脚本与开机自启动
在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设定相关参数,首先先介 ...
- Linux SendMail服务启动慢总结
在 CentOS release 6.6 上启动sendmail服务时发现服务启动过程非常慢,基本上要耗费3分多钟.有点纳闷:什么原因导致sendmail启动这么慢?搜索了这方面的一些资料,结合自己的 ...
- linux以服务的方式启动mongodb,linux以服务的方式启动MongoDB
以下假设 MongoDB安装在/mydata/mongo 文件夹 编写配置文件 # 数据库存储位置 dbpath=/mydata/mongodb/db/ # 数据库日志 logpath=/mydata ...
- linux mongodb服务启动命令行,Linux下安装、启动、停止mongodb
1.下载完安装包,并解压 tgz(以下演示的是 64 位 Linux上的安装) curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_6 ...
- Linux CentOS服务启动
Linux CentOS下如何确认MySQL服务已经启动 Linux CentOS一般做为服务器使用,因此,MySQL服务应该随开机自动启动的.正常情况下,查看开机自动启动的服务使用chkconfig ...
最新文章
- lucene Index Store TermVector 说明
- python培训比较好的机构-python哪家的培训比较好?
- java编译器jdk版本_以编程方式确定Java类的JDK编译版本
- mysql5.6 优点_MySQL5.6复制:GTID的优点和限制(第一部分)_MySQL
- python分治算法_分治法及其python实现例子
- 加快ALTER TABLE 操作速度
- linux命令大全之ss命令详解(获取socket统计信息)
- DOS命令与批处理学习历程
- 多元统计分析及R语言建模(王斌会)第五、六、七章答案
- 软件测试项目案例.pdf,【精选】最经典软件测试案例.pdf
- 《李宗仁回忆录》完整版在线及电子书下载
- vue ui创建项目的常见错误
- Linux基础(三)
- 【SpringBoot系列】自动装配原理
- CSS 属性 aspect-ratio
- python-树-BST_Traversal-二叉搜索树的遍历
- 最简单深度学习Python实现(二分类问题)
- MAC 打开所有来源的程序
- 主力用计算机吸筹,主力进场买点 找主力吸筹提款 通达信副图指标 源码 贴图(图文)...
- php论坛mybb,MyBB
热门文章
- 人生就像一张茶几,摆满了各种杯具/洗具/餐具!
- [转载]实时 Java,第 5 部分: 编写和部署实时 Java 应用程序
- MT2014——打靶
- chrome 插件 —— Volume Control 调节声音
- CASAIM自动化精密尺寸测量设备全尺寸检测铸件自动化检测铸件
- 如何计算根号之牛顿迭代法
- 四、s3c2440 裸机开发 通用异步收发器UARN
- 关于nmap -O扫描中出现索尼手机的一份调研
- C. The Intriguing Obsession
- App 界的一股清流 音视频应有尽有 完全按照 Material design 规范设计的 App