生产环境中FTP服务器可能因网络波动或资源耗尽宕机,自动重启机制是运维标配。常见方法包括:推荐使用systemd服务配置重启策略;supervisord进程管理工具适合容器环境;cron定时任务简单但不够灵活;旧版系统可用init.d脚本。建议优先使用systemd。
在生产环境中,FTP服务器意外宕机是件比较麻烦的事情——可能因为网络波动、资源耗尽,甚至某个隐蔽的内存泄漏。如果在深夜突然中断,没有人员值守就只能等到第二天才能恢复。因此,为FTPServer配置自动重启机制,几乎成为运维标配。下面梳理几种主流方案,从最推荐的方法到传统方法,按需选择即可。
sudo nano /etc/systemd/system/vsftpd.service
填入以下内容(注意根据实际路径和用户调整):
[Unit]
Description=vsftpd FTP Server
After=network.target
[Service]
Type=simple
User=ftpuser
Group=ftpuser
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
关键点在于Restart=on-failure和RestartSec=5——前者告诉systemd:只要进程非正常退出,就自动拉起来;后者设置重试间隔为5秒,避免频繁重启造成系统负担。
配置完成后,按顺序执行:
sudo systemctl daemon-reload
sudo systemctl enable vsftpd
sudo systemctl start vsftpd
用sudo systemctl status vsftpd检查状态,如果看到active (running)就说明一切正常。此后即使进程崩溃,systemd也会在5秒内将其重新唤起来。
sudo apt-get install supervisor
然后为vsftpd单独建立一个配置文件:
sudo nano /etc/supervisor/conf.d/vsftpd.conf
内容如下:
[program:vsftpd]
command=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
autostart=true
autorestart=true
stderr_logfile=/var/log/vsftpd.err.log
stdout_logfile=/var/log/vsftpd.out.log
autorestart=true就是自动重启的核心开关。配置完成后执行:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start vsftpd
通过sudo supervisorctl status vsftpd查看状态,只要显示RUNNING,就表示进程管理到位。supervisord的好处是:即使修改配置文件,也能通过reread和update热加载,不需要重启整个服务。
sudo crontab -e
在末尾添加一行(每分钟重启一次,实际使用时按需调整时间间隔):
* * * * * /usr/sbin/service vsftpd restart # Debian/Ubuntu
# 或
* * * * * /sbin/service vsftpd restart # CentOS/RHEL
保存后cron会自动加载。缺点很明显:不管进程是否正常,到点就重启,可能打断正在进行的传输。而且如果进程已经挂了,要等到下一个分钟才能拉起来。因此这种方法只适合临时兜底,或者对重启窗口不敏感的场景。
sudo nano /etc/init.d/vsftpd
填入以下内容(路径根据实际调整):
#!/bin/sh
### BEGIN INIT INFO
# Provides: vsftpd
# Required-Start: $local_fs $network
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Start vsftpd FTP server at boot time
# Description: Enable vsftpd service provided by daemon.
### END INIT INFO
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/vsftpd
DAEMON_ARGS="/etc/vsftpd/vsftpd.conf"
NAME=vsftpd
DESC="vsftpd FTP Server"
test -x $DAEMON || exit 0
set -e
case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --exec $DAEMON -- $DAEMON_ARGS
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --exec $DAEMON
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --exec $DAEMON
sleep 1
start-stop-daemon --start --quiet --exec $DAEMON -- $DAEMON_ARGS
echo "$NAME."
;;
status)
status_of_proc -p /var/run/$NAME.pid $DAEMON && exit 0 || exit $?
;;
*)
echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload|status}" >&2
exit 1
;;
esac
exit 0
然后设置执行权限并注册服务:
sudo chmod +x /etc/init.d/vsftpd
sudo update-rc.d vsftpd defaults # Debian/Ubuntu
# 或
sudo chkconfig vsftpd on # CentOS/RHEL
sudo service vsftpd start
用sudo service vsftpd status检查。这种方法的自动重启需要额外配合cron或监控脚本,因为init.d本身只负责启动/停止,不具备进程守护能力。因此通常还得叠加一个定时任务来检查进程是否存在,如果挂了就调用service vsftpd start。
---
一点小建议:如果系统能安装systemd,尽量使用它——配置简洁、重启策略灵活、日志也漂亮。supervisord适合容器或需要统一管理多个进程的场景。cron和init.d属于“有得选就选前面几种”,毕竟轮询重启总是有些粗糙。但不管用哪种,配置完成后记得做一次模拟故障测试:手动杀掉FTP进程,看看系统能否按预期自动拉起来。验证通过,才能安心休息。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述