Posted on:
Last modified:
大多数的 Linux 系统已经选择了 systemd 来作为进程管理器。之前打算使用 supervisord 来部署服务,思考之后发现还不如直接使用 systemd 呢。这篇文章简单介绍下 systemd。
我们从一个例子开始,比如说我们有如下的 go 程序:
package main
import (
fmt
net/http
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, Hi there!)
}
func main() {
http.HandleFunc(/, handler)
http.ListenAndServe(:8181, nil)
}
编译到 /opt/listen/listen 这里。首先我们添加一个用户,用来运行我们的服务:
adduser -r -M -s /bin/false www-data
记下这条命令,如果需要添加用户来运行服务,可以使用这条。
Unit 文件定义了一个 systemd 服务。/usr/lib/systemd/system/
存放了系统安装的软件的 unit
文件,/etc/systemd/system/
存放了系统自带的服务的 unit 文件。 我们编辑
/etc/systemd/system/listen.service
文件:
[Unit]
Description=Listen
[Service]
User=www-data
Group=www-data
Restart=on-failure
ExecStart=/opt/listen/listen
WorkingDirectory=/opt/listen
Environment=VAR1=whatever VAR2=something else
EnvironmentFile=/path/to/file/with/variables
[Install]
WantedBy=multi-user.target
然后
systemctl enable listen
systemctl status listen
systemctl start listen
其他一些常用的操作还包括:
systemctl start/stop/restart
systemctl reload/reload-or-restart
systemctl enable/disable
systemctl status
systemctl is-active
systemctl is-enabled
systemctl is-failed
systemctl list-units [--all] [--state=…]
systemctl list-unit-files
systemctl daemon-reload
systemctl cat [unit-name]
systemctl edit [uni-name]
systemctl list-dependencies [unit]
In that case add Requires=B and After=B to the [Unit] section of A. If the dependency is optional, add Wants=B and After=B instead. Note that Wants= and Requires= do not imply After=, meaning that if After= is not specified, the two units will be started in parallel. If you service depends on another service, use requires= + after= or wants= + after=
尚未研究的问题:如何使安装的服务开机启动?是更改 wantedby 吗?如果是,wantedby 的值应该是 什么?对于 nginx 这样的 daemon 服务如何管理?
Type: simple / forking 关于每个字段的含义,可以参考 这篇文章
首先吐槽一下,为什么要使用 journal 这么一个拗口的单词,叫做 logctl 不好么
journalctl -u service-name.service
还可以添加 -b
仅查看本次重启之后的日志。
有时候 journald 占用的空间会过多,这时候可以压缩一下:
$ journalctl --disk-usage
Journals take up 3.8G on disk.
vi /etc/systemd/journald.conf
SystemMaxUse=50M
sudo systemctl restart systemd-journald
systemd 整合了诸多管理组件,比如 hostname, timezone 等等
# 设置 hostname
sudo hostnamectl set-hostname NEW_HOSTNAME
# 列出时区
sudo timedatectl list-timezones
# 设置时区
sudo timedatectl set-timezone Asia/Shanghai
© 2016-2022 Yifei Kong. Powered by ynotes
All contents are under the CC-BY-NC-SA license, if not otherwise specified.
Opinions expressed here are solely my own and do not express the views or opinions of my employer.
友情链接: MySQL 教程站