#!/bin/bash # FTP Server 服务管理脚本 # 用法: ./service-linux.sh {install|uninstall|start|stop|restart|status|enable|disable|logs} # 配置区域 - 请根据实际路径修改 INSTALL_DIR="/opt/ftp-server" FTP_EXE="$INSTALL_DIR/ftp-server" CONFIG_FILE="$INSTALL_DIR/config.json" SERVICE_NAME="ftp-server" SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" LOG_FILE="$INSTALL_DIR/server.log" PID_FILE="$INSTALL_DIR/ftp-server.pid" # 颜色 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' info() { echo -e "${GREEN}[信息]${NC} $1"; } warn() { echo -e "${YELLOW}[警告]${NC} $1"; } error() { echo -e "${RED}[错误]${NC} $1"; } # 检查 root 权限 check_root() { if [ "$EUID" -ne 0 ]; then error "请使用 root 权限运行此脚本 (sudo ./service-linux.sh ...)" exit 1 fi } # 检查可执行文件 check_exe() { if [ ! -f "$FTP_EXE" ]; then error "找不到 $FTP_EXE" error "请先编译: go build -o $FTP_EXE ." exit 1 fi if [ ! -x "$FTP_EXE" ]; then chmod +x "$FTP_EXE" fi } # 安装服务 do_install() { check_root check_exe # 创建工作目录 mkdir -p "$INSTALL_DIR/data" info "正在创建 systemd 服务文件..." cat > "$SERVICE_FILE" << EOF [Unit] Description=FTP Server with Web Management After=network.target Wants=network-online.target [Service] Type=simple User=root Group=root WorkingDirectory=$INSTALL_DIR ExecStart=$FTP_EXE -config $CONFIG_FILE ExecReload=/bin/kill -HUP \$MAINPID Restart=on-failure RestartSec=5 LimitNOFILE=65535 # 日志输出到 journalctl StandardOutput=journal StandardError=journal SyslogIdentifier=$SERVICE_NAME [Install] WantedBy=multi-user.target EOF # 重载 systemd systemctl daemon-reload info "服务已安装: $SERVICE_FILE" info "使用 '$0 start' 启动服务" info "使用 '$0 enable' 设置开机自启" } # 卸载服务 do_uninstall() { check_root info "正在停止服务..." systemctl stop "$SERVICE_NAME" 2>/dev/null systemctl disable "$SERVICE_NAME" 2>/dev/null if [ -f "$SERVICE_FILE" ]; then rm -f "$SERVICE_FILE" systemctl daemon-reload info "服务已卸载" else warn "服务文件不存在,可能未安装" fi } # 启动服务 do_start() { if [ -f "$SERVICE_FILE" ]; then check_root systemctl start "$SERVICE_NAME" if [ $? -eq 0 ]; then info "服务已启动" info " FTP端口: 2121" info " Web管理: http://localhost:8080" else error "服务启动失败,查看日志: $0 logs" exit 1 fi else # 前台/后台直接运行 check_exe info "以后台模式启动..." cd "$INSTALL_DIR" nohup "$FTP_EXE" -config "$CONFIG_FILE" >> "$LOG_FILE" 2>&1 & echo $! > "$PID_FILE" sleep 1 if kill -0 $(cat "$PID_FILE" 2>/dev/null) 2>/dev/null; then info "服务已启动 (PID: $(cat $PID_FILE))" info " FTP端口: 2121" info " Web管理: http://localhost:8080" info " 日志文件: $LOG_FILE" else error "服务启动失败,查看日志: $LOG_FILE" rm -f "$PID_FILE" exit 1 fi fi } # 停止服务 do_stop() { if [ -f "$SERVICE_FILE" ]; then check_root systemctl stop "$SERVICE_NAME" if [ $? -eq 0 ]; then info "服务已停止" else error "服务停止失败" exit 1 fi elif [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") if kill -0 "$PID" 2>/dev/null; then kill "$PID" sleep 2 if kill -0 "$PID" 2>/dev/null; then kill -9 "$PID" fi rm -f "$PID_FILE" info "服务已停止 (PID: $PID)" else warn "进程 $PID 已不存在" rm -f "$PID_FILE" fi else # 尝试查找进程 PID=$(pgrep -f "$FTP_EXE") if [ -n "$PID" ]; then kill "$PID" info "服务已停止 (PID: $PID)" else warn "服务未在运行" fi fi } # 重启服务 do_restart() { do_stop sleep 2 do_start } # 查看状态 do_status() { if [ -f "$SERVICE_FILE" ]; then systemctl status "$SERVICE_NAME" --no-pager elif [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") if kill -0 "$PID" 2>/dev/null; then info "服务运行中 (PID: $PID)" else warn "服务未在运行 (PID文件过期)" rm -f "$PID_FILE" fi else PID=$(pgrep -f "$FTP_EXE") if [ -n "$PID" ]; then info "服务运行中 (PID: $PID)" else warn "服务未在运行" fi fi } # 开机自启 do_enable() { check_root if [ -f "$SERVICE_FILE" ]; then systemctl enable "$SERVICE_NAME" info "已设置开机自启" else error "请先运行 '$0 install' 安装服务" exit 1 fi } # 关闭自启 do_disable() { check_root if [ -f "$SERVICE_FILE" ]; then systemctl disable "$SERVICE_NAME" info "已关闭开机自启" else error "服务未安装" exit 1 fi } # 查看日志 do_logs() { if [ -f "$SERVICE_FILE" ]; then journalctl -u "$SERVICE_NAME" -f --no-pager -n 50 elif [ -f "$LOG_FILE" ]; then tail -f "$LOG_FILE" else warn "没有可用的日志文件" fi } # 菜单模式 do_menu() { while true; do echo "" echo "========================================" echo " FTP Server 服务管理工具 (Linux)" echo "========================================" echo "" echo " 1. 安装服务 (systemd)" echo " 2. 卸载服务" echo " 3. 启动服务" echo " 4. 停止服务" echo " 5. 重启服务" echo " 6. 查看服务状态" echo " 7. 开机自启 - 开启" echo " 8. 开机自启 - 关闭" echo " 9. 查看运行日志" echo " 0. 退出" echo "" read -p "请输入选项: " choice case $choice in 1) do_install ;; 2) do_uninstall ;; 3) do_start ;; 4) do_stop ;; 5) do_restart ;; 6) do_status ;; 7) do_enable ;; 8) do_disable ;; 9) do_logs ;; 0) exit 0 ;; *) warn "无效选项" ;; esac read -p "按 Enter 继续..." done } # 主入口 case "${1:-}" in install) do_install ;; uninstall) do_uninstall ;; start) do_start ;; stop) do_stop ;; restart) do_restart ;; status) do_status ;; enable) do_enable ;; disable) do_disable ;; logs) do_logs ;; menu|"") do_menu ;; *) echo "用法: $0 {install|uninstall|start|stop|restart|status|enable|disable|logs|menu}" echo "" echo "命令说明:" echo " install - 安装为 systemd 服务" echo " uninstall - 卸载服务" echo " start - 启动服务" echo " stop - 停止服务" echo " restart - 重启服务" echo " status - 查看服务状态" echo " enable - 设置开机自启" echo " disable - 关闭开机自启" echo " logs - 查看运行日志 (实时)" echo " menu - 交互式菜单 (默认)" exit 1 ;; esac