准备Clash配置文件和二进制文件
确定Clash二进制文件和配置目录位置
在使用systemd管理Clash服务之前,需要先将Clash的可执行文件和配置文件准备好并放置在系统目录中。Clash的二进制文件(如clash或mihomo)通常放置在/usr/local/bin/或/usr/bin/目录下,配置文件config.yaml放置在/etc/clash/目录中。执行sudo mkdir -p /etc/clash创建配置目录,将config.yaml文件复制到该目录中。若使用订阅链接,可先通过wget下载订阅内容并保存为/etc/clash/config.yaml。确保Clash二进制文件具有可执行权限(chmod +x /usr/local/bin/clash)。
创建专用的系统用户运行服务
为了提升安全性,建议创建一个专用的系统用户来运行Clash服务,避免使用root权限执行代理服务。执行sudo useradd -r -s /usr/sbin/nologin -M clash创建名为clash的系统用户,该用户无登录权限且无家目录。将Clash配置目录的所有权赋予该用户:sudo chown -R clash:clash /etc/clash。若Clash需要写入日志或缓存文件,确保相关目录的写入权限已正确设置。
验证配置文件格式是否正确
在编写systemd服务文件之前,先手动测试Clash能否正常加载配置文件,避免因配置错误导致服务启动失败。执行sudo -u clash /usr/local/bin/clash -t -f /etc/clash/config.yaml测试配置文件格式是否正确。若输出显示Configuration file test passed,则说明配置文件格式正确。若出现错误提示,需先修正配置文件中的YAML格式错误或不支持的规则类型,确保Clash能够正常解析配置。
创建systemd服务文件
服务文件的存放路径与基本结构
systemd服务文件存放在/etc/systemd/system/目录中,文件名为clash.service。执行sudo vim /etc/systemd/system/clash.service创建并编辑服务文件,填入服务配置内容。服务文件的基本结构包含[Unit](服务描述和依赖关系)、[Service](启动命令、用户和运行参数)和[Install](安装目标)三个主要部分。[Unit]部分中的After=network.target确保在网络就绪后才启动Clash,Wants=network.target声明服务依赖于网络。
服务文件中的关键配置参数
[Service]部分是服务文件的核心,需正确配置启动命令、运行用户和进程管理策略。Type=simple表示Clash以前台进程方式运行(服务本身不作为守护进程)。User=clash和Group=clash指定运行服务的用户和组。ExecStart=/usr/local/bin/clash -d /etc/clash指定Clash可执行文件路径和配置目录。Restart=always和RestartSec=5确保Clash进程在退出后自动重启,且在重启前等待5秒。LimitNOFILE=1048576设置文件描述符上限,避免高并发时因文件描述符耗尽导致服务崩溃。
服务文件的完整配置示例
一个完整的clash.service文件配置示例如下:
[Unit] Description=Clash VPN Service After=network.target Wants=network.target [Service] Type=simple User=clash Group=clash ExecStart=/usr/local/bin/clash -d /etc/clash Restart=always RestartSec=5 LimitNOFILE=1048576 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
其中StandardOutput=journal和StandardError=journal将Clash的标准输出和错误输出重定向到systemd日志系统,便于后续查看日志排查问题。
启用和管理Clash系统服务
启动Clash服务并验证运行状态
服务文件创建完成后,执行sudo systemctl daemon-reload重新加载systemd配置,使新创建的服务文件生效。执行sudo systemctl start clash立即启动Clash服务。执行sudo systemctl status clash查看服务运行状态,确认状态显示为active (running)且无错误信息。若服务启动失败,执行sudo journalctl -u clash -n 50 --no-pager查看最近的日志输出,定位启动失败的具体原因。
设置Clash服务开机自动启动
确认Clash服务能正常启动后,执行sudo systemctl enable clash启用开机自动启动。启用后系统会在每次启动时自动运行Clash服务,无需用户手动启动。执行sudo systemctl is-enabled clash确认服务已成功启用,输出应为enabled。若需要禁用开机自启,执行sudo systemctl disable clash。
服务运行中的常用管理命令
系统服务运行期间,可通过systemctl命令进行常规管理操作。sudo systemctl restart clash重启服务,在修改配置文件后执行该命令使新配置生效。sudo systemctl stop clash停止Clash服务。sudo systemctl reload clash重新加载配置而不重启进程(若Clash支持该操作)。sudo journalctl -u clash -f实时查看Clash服务的日志输出,便于监控运行状态和排查问题。
配置文件更新后的服务重载
修改配置文件后重启服务使新配置生效
修改/etc/clash/config.yaml文件后,需要重启Clash服务才能使新配置生效。执行sudo systemctl restart clash重启服务,新配置会被加载。若在重启后服务启动失败,执行sudo journalctl -u clash -n 50 --no-pager查看错误日志,确认配置修改是否存在格式错误或不支持的规则类型。建议在修改配置后先执行sudo -u clash /usr/local/bin/clash -t -f /etc/clash/config.yaml测试配置格式,确认无误后再重启服务。
订阅更新后的配置刷新
若Clash的节点配置来自订阅链接,且需要在服务运行时定期更新订阅,可在config.yaml中配置自动更新参数,或通过cron定时任务执行订阅更新脚本。更新订阅后,执行sudo systemctl restart clash使新节点生效。若使用外部脚本更新config.yaml,需确保脚本以clash用户身份执行,且更新过程中不会导致配置文件损坏。
日志查看与故障排查
通过systemd日志系统可查看Clash服务的运行日志,帮助定位配置错误、节点连接问题和性能异常。执行sudo journalctl -u clash -n 100 --no-pager查看最近100条日志条目。执行sudo journalctl -u clash -f实时跟踪日志输出。若日志中出现unsupported rule type等警告,需检查配置文件的规则类型是否与Clash内核版本兼容。若日志中出现connection refused或context deadline exceeded,需检查节点可用性和网络连通性。
常见问题FAQ
systemd服务启动Clash时报错“Permission denied”怎么解决?
权限错误通常由配置文件或二进制文件的权限设置不当引起。检查Clash二进制文件是否具有可执行权限(chmod +x /usr/local/bin/clash)。检查/etc/clash/目录和config.yaml文件是否对clash用户有读取权限(sudo chown -R clash:clash /etc/clash)。若Clash需要写入日志或缓存,确保目标目录对clash用户有写入权限。
Clash服务启动后立即退出,状态显示“failed”,如何排查?
执行sudo journalctl -u clash -n 50 --no-pager查看错误日志。常见启动失败原因包括:配置文件YAML格式错误、节点名称重复、不支持的规则类型、端口被占用等。根据日志中的具体错误信息修正配置后重启服务。也可先手动以clash用户身份运行/usr/local/bin/clash -d /etc/clash观察终端输出,获取更详细的错误信息。
systemd中如何设置Clash在开机时延迟启动?
若Clash启动过早导致网络未就绪,可在服务文件中添加延迟启动参数。在[Service]部分添加ExecStartPre=/bin/sleep 10,让服务在启动前等待10秒。或将Type=simple改为Type=idle,让Clash在所有其他服务加载完成后再启动。
Clash服务运行正常但代理不生效,怎么排查?
检查服务使用的配置文件是否包含正确的节点和规则。执行sudo cat /etc/clash/config.yaml | grep -E "^proxies:"确认节点列表是否存在。检查Clash的HTTP代理端口是否在监听:sudo netstat -tlnp | grep clash。在终端中测试代理连通性:curl -x http://127.0.0.1:7890 https://www.google.com。若代理端口未监听,检查配置中port字段是否正确设置。
