[记录]不使用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/[email protected]/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 [email protected]
的方式代替 sudo su
.
使用 --user 启动的进程,在用户退出登录后会自动销毁,需要使用 loginctl enable-linger username
来保持。
参考链接
ArchLinux:systemd (简体中文)
How To run Systemd Service without root / sudo