|
|
@@ -0,0 +1,305 @@
|
|
|
+#!/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
|