| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- #!/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
|