[记录]不使用root或sudo运行systemd服务

需求点

systemd是一套系统组件合集,现在要说的是其中的systemctl命令,它是用来控制和查看系统服务的。
通常情况下需要使用root或者有sudo权限的用户进行操作,这在某些场景下不能满足需要或者有不安全隐患。

现在我们来尝试使用常规权限用户启动服务。

创建服务

属于用户的服务要放在 ~/.config/systemd/user 目录下,这是个固定的目录,后面的user不可替换

mkdir ~/.config/systemd/user

这里以启动一个nginx为例创建一个服务,vi ~/.config/systemd/user/nginx.service

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/home/work/local/nginx/run/pid
ExecStart=/home/work/local/nginx/sbin/nginx -c /home/work/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitCORE=infinity
LimitNOFILE=1000000
LimitNPROC=1000000

[Install]
WantedBy=multi-user.target


服务配置

创建或修改服务后,需要载入配置:

systemctl --user daemon-reload

启动前也可先验证服务的可用性

systemctl --user list-unit-files nginx.service
UNIT FILE          STATE
nginx.service      disable

1 unit files listed.


设置服务自启动,--now参数会在设置后立即启动服务,等同于再执行start操作:

systemctl --user enable --now nginx


查看服务状态:

systemctl --user status nginx.service
● nginx.service - nginx - high performance web server
   Loaded: loaded (/home/work/.config/systemd/user/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2021-08-24 13:55:15 CST; 1min ago
     Docs: http://nginx.org/en/docs/
 Main PID: 85498 (nginx)
   CGroup: /user.slice/user-999.slice/user@999.service/nginx.service
           ├─85498 nginx: master process /home/work/local/nginx/sbin/nginx -c /home/work/local/nginx/conf/nginx.conf
           ├─85499 nginx: worker process
           └─85500 nginx: worker process

总结

可见相较于常规操作,添加了--user参数,这个参数是指定管理当前用户的服务。

然后就是配套的journalctl --user无法正常使用,查看日志是个问题。

如果是使用了 sudo su 切换用户可能会导致 journalctl --user无法正常使用,通常的报错是:Failed to connect to bus: No such file or directory,你可以使用 ssh username@127.0.0.1 的方式代替 sudo su.

使用 --user 启动的进程,在用户退出登录后会自动销毁,需要使用 loginctl enable-linger username 来保持。

参考链接

ArchLinux:systemd (简体中文)
How To run Systemd Service without root / sudo

标签: systemd, systemctl

添加新评论