Linux中有很多命令已经存在了N多年,渐渐有些已被一些新的命令所代替,不过由于习惯的原因,很多时候我们并不能一下子适应过来,例如:ifconfig之于ip命令。
最近在使用ArchLinux的时候用到了systemctl命令,虽然之前在 “Linux中国” 上看到了关于 systemd 的文章,不过当时没有什么感觉,认为自己一时半会是不会用到这个工具的,但世事难料,没想到这么快我就要花时间研究这个命令并在实际中使用了。
systemctl是systemd下的一个工具。网上查了下,该命令是用来替代service和chkconfig两个命令的。
参考链接:
- https://fedoraproject.org/wiki/Systemd/zh-cn
- http://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/
- https://wiki.archlinux.org/index.php/Systemd
- https://linux.cn/article-3801-1.html
- https://linux.cn/article-5926-1.html
- http://www.tecmint.com/manage-services-using-systemd-and-systemctl-in-linux/
- http://linoxide.com/linux-command/linux-systemd-commands/
- =
- http://www.111cn.net/sys/linux/65797.htm
- http://blog.csdn.net/julius819/article/details/7665679
- http://blog.csdn.net/jiangzhengdong/article/details/9070093
- http://godontop.com/systemctl%E5%91%BD%E4%BB%A4%E7%94%A8%E6%B3%95%E8%AF%A6%E8%A7%A3-234/
参考解答:
- 系统环境:4.0.7-2-ARCH
- 所在路径:/usr/bin/systemctl
#将httpd服务设为开机自动启动(enable)
systemctl enable httpd.service
#检查httpd服务是否为开机启动(is-enabled)
systemctl is-enabled httpd.service
#禁止httpd服务开机自动启动(disable)
systemctl disable httpd.service
#查看httpd服务的运行状态(status)
systemctl status httpd.service
#启动httpd服务(start)
systemctl start httpd.service
#检查httpd服务是否处于活动状态(is-active)
systemctl is-active httpd.service
#停止httpd服务(stop)
systemctl stop httpd.service
#重新加载httpd服务(reload)
systemctl reload httpd.service
#重新启动httpd服务(restart)
systemctl restart httpd.service
#显示启动失败的服务(--failed
)
# systemctl --failed LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type.
==
1.更快的启动速度/精准分析
# systemd-analyze #查看系统引导用时 Startup finished in 1.520s (kernel) + 709ms (userspace) = 2.229s # systemd-analyze blame #以进程初始化所占用时间排序 # systemd-analyze critical-chain #分析启动时的关键链 # systemd-analyze critical-chain httpd.service #分析某个服务(httpd)的关键链
2.列出正在运行/可用/所有的units
# systemctl # systemctl list-units #列出所有运行中单元 # systemctl list-unit-files #列出所有可用单元 # systemctl list-unit-files --type=service #列出所有服务(包括启用的和禁用的) # systemctl list-unit-files --type=mount #列出所有系统挂载点 # systemctl list-unit-files --type=socket #列出所有可用系统套接口
3.列出失败的units
systemctl --failed
4.systemd和sysVinit
Systemd有一个完成与sysVinit的runlevels相似任务的构想。
sysVinit的runlevels大多是以数字分级的,下面是runlevels在systemd中的对应元素:
- 0 runlevel0.target, poweroff.target
- 1, s, single runlevel1.target, rescue.target
- 2, 4 runlevel2.target, runlevel4.target, multi-user.target
- 3 runlevel3.target, multi-user.target
- 5 runlevel5.target, graphical.target
- 6 runlevel6.target, reboot.target
- emergency emergency.target
5.systemd的日志
#journald是systemd独有的日志系统,替换了sysVinit中的syslog守护进程。可以用命令journalctl来读取日志
journald
#运行journalctl -b命令来查看所有引导日志
journalctl -b
#实时显示系统日志(类似tail -f)
journalctl -f
#查看特定服务的日志
journalctl /usr/bin/dhcpcd
6.电源管理
#systemctl命令也可以用来关机,重启或者休眠。要关机、重启、挂起和休眠,分别使用如下命令:
systemctl poweroff
systemctl reboot
systemctl suspend
systemctl hibernate
7.在systemd中显示系统信息的新方法
hostnamectl
8.其它
# systemctl get-default #列出当前使用的运行等级 # systemctl show httpd #检查某个服务的所有配置细节 # systemd-analyze critical-chain httpd.service #分析某个服务(httpd)的关键链 # systemctl list-dependencies httpd.service #获取某个服务(httpd)的依赖性列表
=EOF=
《 “Linux的systemd相关知识学习” 》 有 13 条评论
systemd 和 sysVinit 命令对比的「速查表」
http://linoxide.com/linux-command/systemd-vs-sysvinit-cheatsheet/
http://images.linoxide.com/systemd-vs-sysVinit-cheatsheet.pdf
http://images.linoxide.com/systemd-vs-sysVinit-cheatsheet-A4.jpg
http://linoxide.com/linux-command/linux-systemd-commands/
在CentOS 7上查看/启动/停止MySQL服务:
`
systemctl status/start/stop mysql.service
`
有时候会忘了服务的名称,比如OpenSSH服务的名称到底是:ssh还是sshd?
一方面可以直接尝试;
另一方面可以通过查看对应的「.service」文件名称来获取(在CentOS 7上默认是在「/usr/lib/systemd/system/」目录中):
`$ sudo find / -type f -name “*.service”
$ ls /usr/lib/systemd/system/*.service
`
一般情况下 `systemd` 中可以通过 `systemctl` 命令进行「启动(start)/停止(stop)/重启(restart)/开机自启动(enable)」等设置,但对于类似于Nginx这样的服务来说,如果只是简单修改了一下配置文件,最好还是希望能通过重新加载配置文件的方式避免重启,但我又不清楚它是否支持 `reload` 这样的命令,这时就可以通过查看服务对应的 .service 文件来判定该服务是否支持 reload 等操作:
`
# find / -type f -iname “nginx.service”
# cat /usr/lib/systemd/system/nginx.service
…
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
…
`
systemd 最近修复了一个 Bug,一个以数字开头的用户名会造成 systemd 以 Root 用户启动
https://ma.ttias.be/giving-perspective-systemds-usernames-start-digit-get-root-privileges-bug/
Linux pid 1 和 systemd
http://coolshell.cn/articles/17998.html
`
sysvinit 1983年(把整个操作系统带入可操作的状态,串行启动,通过各种启停脚本)
UpStart 2006年(基于事件驱动的机制,把之前的完全串行的同步启动服务的方式改成了由事件驱动的异步的方式)
systemd 2010年(按需启动,能不启动就不启动,如果要启动,能并行启动就并行启动,包括你们之间有依赖,我也并行启动)
`
浅谈Linux服务管理器Systemd
https://addops.cn/post/systemd.html
加固 systemd 服务
https://blog.lilydjwg.me/2018/2/10/harden-a-systemd-service.212145.html
`
[Unit]
Description=Graphite/Carbon
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/carbon-cache.py –config=/etc/carbon/carbon.conf start
User=carbon
PrivateTmp=true
PrivateDevices=true
ProtectSystem=full
ProtectHome=true
NoNewPrivileges=true
CapabilityBoundingSet=
ReadOnlyPaths=/
ReadWritePaths=/run
ReadWritePaths=/var/log/carbon
ReadWritePaths=/var/lib/carbon
[Install]
WantedBy=multi-user.target
`
Systemd 定时器教程
http://www.ruanyifeng.com/blog/2018/03/systemd-timer.html
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
`
$ sudo systemctl status postfix
$ sudo systemctl start postfix
$ sudo systemctl reload postfix
`
重启postfix
https://serverfault.com/questions/816139/restart-postfix-using-systemd-without-dropping-connections
Systemd曝出三个漏洞 绝大部分 Linux 发行版易受攻击
https://www.cnbeta.com/articles/tech/808551.htm
https://www.qualys.com/2019/01/09/system-down/system-down.txt
`
CVE-2018-16864
CVE-2018-16865
CVE-2018-16866
Combined Exploitation of CVE-2018-16865 and CVE-2018-16866
`
systemd-journald 的两个漏洞介绍(CVE-2018-16865、CVE-2018-16866)及利用方法, Part 1
https://capsule8.com/blog/exploiting-systemd-journald-part-1/
使用 systemd 限制系统资源的使用
https://arstercz.com/%E4%BD%BF%E7%94%A8-systemd-%E9%99%90%E5%88%B6%E7%B3%BB%E7%BB%9F%E8%B5%84%E6%BA%90%E7%9A%84%E4%BD%BF%E7%94%A8/
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html-single/resource_management_guide/index
https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html
How can I configure a service to run only on a specific CPU under systemd?
https://access.redhat.com/solutions/2142471
清理systemd日志
https://tlanyan.me/clear-systemd-journal-logs/
https://linuxhandbook.com/clear-systemd-journal-logs/
`
journalctl提供了三种清理systemd日志的方式。
第一种是清理指定时间之前的日志:
# 清理7天之前的日志
sudo journalctl –vacuum-time=7d
# 清理2小时之前的日志
sudo journactl –vacuum-time=2h
# 清理10秒之前的日志
sudo journalctl –vacuum-time=10s
# 上述命令示例输出:
# Vacuuming done, freed 3.7G of archived journals on disk.
第二种是限制日志占用的空间大小:
# 限制systemd日志占用不超过1G空间
sudo journalctl –vacuum-size=1G
# 限制systemd日志占用不超过100M
sudo journalctl –vacuum-size=100M
# 输出与第一种类似
第三种是保留日志文件个数:
# 保留最近的5个日志文件
sudo journalctl –vacuum-files=5
# 输出与第一种类似
第四种方法:
编辑配置 /etc/systemd/journald.conf 文件
`