前言

很久以前依赖screen去保活一些程序,比如跑一个python项目,并不需要用户输入和交互,这时候就没有必要在screen里面运行。如果厌烦了screen的管理,又或者需要开机自启动,这时候就需要换一个重量级的系统服务来接管了。systemd是较新的linux发行版的一种特性,功能十分强大,且管理非常方便,支持开机自启动,系统也可以很方便的和services进行联动。screen是第三方软件,与系统的契合度没有linux自带的来的实在。

不过screen就这么一文不值么?并不是,虽然很多时候它们效果是一样的,但为了方便管理,不选择那些管理麻烦的东西。screen适用于那些daemon但是你还需要去手动管理的东西,比如启动服务器你要screen -S mc 然后进去再一顿操作再Ctrl A+D,这个是systemd很难做到的(systemd用户手动交互可能很麻烦,mc服务器如果使用systemd的话只能使用rcon去管理了)。

Screen和Systemd运行模式的对比

所以我们在不需要大量用户交互的情况下,使用systemd来启动我们的服务。

一般服务文件都在/lib/systemd/system/servicename.service(servicename.service就是我们要编辑的服务文件了)

自动向导式安装服务

https://github.com/SakurabaKiyoka/Systemd-onekey-installer

直接使用可以

wget https://raw.githubusercontent.com/SakurabaKiyoka/Systemd-onekey-installer/master/install.sh && bash install.sh

服务设置

[Unit]
Description=描述
After=network.target
[Service]
Type=类型
User=运行用户
WorkingDirectory=工作目录
ExecStart=启动服务时执行的命令绝对路径
ExecStartPre=启动服务时预先执行的命令绝对路径
ExecReload=重启服务时执行的命令绝对路径
ExecStop=停止服务时执行的命令绝对路径
Restart=何时重启
[Install]
WantedBy=multi-user.target

Description的描述随意

After是指等待什么启动后执行,自启动用,上面的是代表网络链接成功后开始执行该服务。

type是执行类型,常用有simple(被运行程序是daemon,也就是关掉ssh会被杀死的那种),oneshot(一次性执行,系统不会保活该程序,多用于开机自启动的一次性程序)

user是运行用户,以什么用户的身份运行

WorkingDirectory就是工作目录,一般不用设置,仅当正常运行没问题,写到服务就跑不起来的时候考虑修改

Exec系列上面已经解释了

Restart何时重启的问题可以选择always和on-fail,always是无条件重启,不管他是正常退出还是异常退出,on-fail则是异常情况退出自动重启。

把这些修改写进你的servicename.service之后

执行systemctl daemon-reload

然后systemctl start servicename(必须和你.service的一致,此处名字和servicename可以自定义但是一定保持一致)

若要自启动则systemctl enable servicename

取消自启动则systemctl disable servicename


你是否会像清风拂过花儿一样与我相遇呢?