我刚刚将服务器从 Ubuntu 14.10 升级到 15.04,我通过自定义 upstart 脚本启动的几个服务不再运行。
我的理解是我需要将它们重写为systemd
服务,但是一夜之间学习整个系统的想法systemd
有点令人生畏。
upstart 脚本只是autossh
在启动时启动,我还有几个其他类似的脚本可以启动长时间运行的进程。
#/etc/init/autossh.conf
description "Maintain a permanent SSH tunnel to <other_server>"
start on started mountall
stop on shutdown
exec autossh -N other_server
我怎样才能将其重写为一项systemd
服务?
答案1
迁移到 systemd 的第一条规则
截至目前,也就是 2015 年,很可能已经有人这样做了。
systemd 已经存在好几年了。而且已经有一大批人编写单元文件并发布它们。GitHub 似乎特别吸引了服务单元集合的存储库。
事实上,简单地在 WWW 上搜索autossh.service
(作为短语)就会得到以下结果:
- Phillipp Klaus 正在做这件事2013年
- 托马斯·弗里茨正在做这件事2014年
- 不知名的人在做这件事2013年
模板单元
话虽如此,正如我在 StackExchange 上的几个地方指出的那样,这种迁移不是一个机械的过程,有时只是机械地将已有的内容转换为单元文件是错误的,或者至少是错误的。在这种情况下,autossh
肯定需要用模板单元,它被实例化为实际的服务单元,由目标名称参数化。因此,有:/etc/systemd/system/[email protected]
[单元] 描述=来自 %i 的反向隧道的 AutoSSH 服务 之后=网络.目标 [服务] 用户=autossh 环境文件=/etc/%p/%i.conf ExecStart=/usr/bin/autossh -M 0 -q -N $SSH_USER@%i $SSH_OPTIONS [安装] WantedBy=多用户.目标
创建一个名为的文件/etc/autossh/other_server.example.conf
,至少命名为:
SSH_USER=joe
然后应用所有常见的控制措施:
systemctl enable autossh@other_server.example
— 允许实例在引导时自动启动。systemctl start autossh@other_server.example
— 立即手动启动该实例。systemctl status autossh@other_server.example
— 查看其状态。
是的,第一条规则也适用于此。搜索后,可以发现 OpenSUSE 的 Greg Freemyer 比我早了不到两周就做到了这一点。