Notice: This article is only available in Chinese version. :(
习惯了诸如 " systemctl {start|status|stop|enable|disable} httpd " 等类似的命令?在Linux中如何将普通的应用程序设置成服务?
这里以 frp client 为例,实现在 Ubuntu 18.04 上的普通的应用程序添加进守护进程以方便配置自启动。
配置service文件
在应用程序的安装或配置位置,新建一个 frpc.service ,然后再来按照区块编辑这个文件:
Unit
负责服务的描述,启动顺序和依赖关系。
Before
和 After
定义服务的启动顺序(在某个程序之前或之后)。 require
要求某个服务启动成功,否则不会启动该自定义服务,而 Wants
则不会终止该自定义服务的启动。
[Unit]
Description=Frp client daemon
After=network.target network-online.target syslog.target
Wants=network.target network-online.target
Service
Exec* 字段定义服务状态改变前后需要执行的命令:
字段 | 触发时 |
---|---|
ExecReload | 重启服务时执行 |
ExecStop | 停止服务时执行 |
ExecStartPre | 启动服务之前执行 |
ExecStartPost | 启动服务之后执行 |
ExecStopPost | 停止服务之后执行 |
eg1
[Service]
Type=simple
ExecStart=/etc/frp/frpc -c /etc/frp/frpc.ini
Restart=always
eg2
[Service]
Type=forking
PIDFile=/var/run/shadowsocks/server.pid
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p /var/run/shadowsocks
ExecStartPre=/bin/chown root:root /var/run/shadowsocks
ExecStart=/usr/local/bin/ssserver --pid-file /var/run/shadowsocks/server.pid --log-file /var/log/shadowsocks.log -c /etc/shadowsocks/config/server.json -d start
Restart=always
RestartSec=24h
User=root
Group=root
UMask=0027
WantedBy
定义服务随何目标启动。下面列出常用目标
目标 | 描述 |
---|---|
muti-user.target | 启动至 init 3 时执行 |
graphical.target | 启动至 init 5 时执行 |
reboot.target | 启动至 init 6 时执行 |
[Install]
WantedBy=multi-user.target
修改文件权限(如果需要):
chmod 755 /etc/frp/frpc.service
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。
使用软连接将刚才建立的service文件指到 " /usr/lib/systemd/system " 内:
ln -s /etc/frp/frpc.service /usr/lib/systemd/system
最后,更新Ubuntu Service守护进程:
systemctl daemon-reload
使用 systemctl 命令操作进程:
设置开机自启:
systemctl enable shadowsocks
启动 Shadowsocks 进程
systemctl start shadowsocks
结束 Shadowsocks 进程
systemctl stop shadowsocks
重启 Shadowsocks 进程
systemctl restart shadowsocks
查看 Shadowsocks 进程运行状态
systemctl status shadowsocks
参考: