如何利用centos 7自带的service创建自启服务。
动机
我的梯子是自建的,用了v2ray+KCPTUN+udp2raw。其中v2ray是梯子的核心,没有使用奇奇怪怪的混淆。KCPTUN通过将KCP报文包裹在UDP中,并进行多倍发包以降低延迟和提高稳定性(因为UDP不需要握手),在晚高峰时效果拔群,代价就是流量多倍消耗,不过自建梯子的瓶颈通常都不是流量。
但是不少地方的运营商会对UDP数据包进行QOS(尤其是手机网络),当运营商间歇性QOS时,我的梯子也会间歇性抽风。因此我又在外面套了一层udp2raw,这个项目可以将UDP包伪装成TCP包,从而避免QOS。
这也是我为什么不使用v2的混淆的原因,就算真如某些小道消息所说,GFW能识别v2流量了,我也不觉得GFW能识别出UDP化再TCP化的v2流量,尤其是这么干的人非常少。
但是有一个问题,v2和KCPTUN都有现成的一键脚本,但是udp2raw偏小众,没有一键脚本,只能用shell运行,参数需要自己用 -XX、-XX的方式附加,自启也得自己搞定。我就是个linux菜鸡,只能去查cento 7的自启怎么配自启。
网上的教程一堆搬运来搬运去的洗稿教程,给我看麻了(尤其是CSDN)。centos 7的自启动服务管理方式和centos 6不一样,很多洗的稿根本没法用。另外,因为udp2raw的需要靠命令行在启动的时候附加参数(端口、模式、密码等),所以并不是简单地实现自启就行了。
最后还是自己搞定了,写一个教程备忘。
实现
通过centos 7自带的service创建一个启动服务即可,创建服务文件:
1
| vim /etc/systemd/system/udp2raw.service
|
然后写入如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| [Unit] # 服务名称 Description=udp2raw启动服务 # 在网络启动之后启动 After=network.target
[Service] # 设置启动服务的类型 Type=simple
# 非正常退出时,自动重启 Restart=on-failure
# 指定被启动的程序的位置和参数(与在终端中运行一样) ExecStart = /home/udp2raw/udp2raw_amd64 -s -l 0.0.0.0:1919 -r 127.0.0.1:810 --raw-mode faketcp -a -k XXXX
# 该进程死亡时的行为 # 以下代码表示会向所有子进程发送SIGTERM信号,再发送SIGKILL型号 KillSignal=SIGTERM KillMode=mixed
[Install] # 多用户模式 WantedBy=multi-user.target
|
保存之后刷新服务,并将其添加为自启动:
1 2 3 4 5 6
| # 重新加载service依赖 systemctl daemon-reload # 启动服务 systemctl start udp2raw.service # 允许自启 systemctl enable udp2raw.service
|
一些其他的指令:
1 2 3 4 5 6 7 8 9 10 11 12
| # 停止服务 systemctl stop udp2raw.service # 重启服务 systemctl restart udp2raw.service # 重新加载服务(重载参数,不会重启服务) systemctl reload udp2raw.service # 禁止自启 systemctl disable udp2raw.service # 禁用服务(不能被其他服务唤醒,也不能用start启动) systemctl mask udp2raw.service # 解除服务禁用 systemctl unmask udp2raw.service
|
相关资料
关于服务创建的其他参数,可以去参考官方文档(以下链接不是centos的,但足够全):
Service unit configuration
Process killing procedure configuration