service-linux.sh 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. #!/bin/bash
  2. # FTP Server 服务管理脚本
  3. # 用法: ./service-linux.sh {install|uninstall|start|stop|restart|status|enable|disable|logs}
  4. # 配置区域 - 请根据实际路径修改
  5. INSTALL_DIR="/opt/ftp-server"
  6. FTP_EXE="$INSTALL_DIR/ftp-server"
  7. CONFIG_FILE="$INSTALL_DIR/config.json"
  8. SERVICE_NAME="ftp-server"
  9. SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
  10. LOG_FILE="$INSTALL_DIR/server.log"
  11. PID_FILE="$INSTALL_DIR/ftp-server.pid"
  12. # 颜色
  13. RED='\033[0;31m'
  14. GREEN='\033[0;32m'
  15. YELLOW='\033[0;33m'
  16. NC='\033[0m'
  17. info() { echo -e "${GREEN}[信息]${NC} $1"; }
  18. warn() { echo -e "${YELLOW}[警告]${NC} $1"; }
  19. error() { echo -e "${RED}[错误]${NC} $1"; }
  20. # 检查 root 权限
  21. check_root() {
  22. if [ "$EUID" -ne 0 ]; then
  23. error "请使用 root 权限运行此脚本 (sudo ./service-linux.sh ...)"
  24. exit 1
  25. fi
  26. }
  27. # 检查可执行文件
  28. check_exe() {
  29. if [ ! -f "$FTP_EXE" ]; then
  30. error "找不到 $FTP_EXE"
  31. error "请先编译: go build -o $FTP_EXE ."
  32. exit 1
  33. fi
  34. if [ ! -x "$FTP_EXE" ]; then
  35. chmod +x "$FTP_EXE"
  36. fi
  37. }
  38. # 安装服务
  39. do_install() {
  40. check_root
  41. check_exe
  42. # 创建工作目录
  43. mkdir -p "$INSTALL_DIR/data"
  44. info "正在创建 systemd 服务文件..."
  45. cat > "$SERVICE_FILE" << EOF
  46. [Unit]
  47. Description=FTP Server with Web Management
  48. After=network.target
  49. Wants=network-online.target
  50. [Service]
  51. Type=simple
  52. User=root
  53. Group=root
  54. WorkingDirectory=$INSTALL_DIR
  55. ExecStart=$FTP_EXE -config $CONFIG_FILE
  56. ExecReload=/bin/kill -HUP \$MAINPID
  57. Restart=on-failure
  58. RestartSec=5
  59. LimitNOFILE=65535
  60. # 日志输出到 journalctl
  61. StandardOutput=journal
  62. StandardError=journal
  63. SyslogIdentifier=$SERVICE_NAME
  64. [Install]
  65. WantedBy=multi-user.target
  66. EOF
  67. # 重载 systemd
  68. systemctl daemon-reload
  69. info "服务已安装: $SERVICE_FILE"
  70. info "使用 '$0 start' 启动服务"
  71. info "使用 '$0 enable' 设置开机自启"
  72. }
  73. # 卸载服务
  74. do_uninstall() {
  75. check_root
  76. info "正在停止服务..."
  77. systemctl stop "$SERVICE_NAME" 2>/dev/null
  78. systemctl disable "$SERVICE_NAME" 2>/dev/null
  79. if [ -f "$SERVICE_FILE" ]; then
  80. rm -f "$SERVICE_FILE"
  81. systemctl daemon-reload
  82. info "服务已卸载"
  83. else
  84. warn "服务文件不存在,可能未安装"
  85. fi
  86. }
  87. # 启动服务
  88. do_start() {
  89. if [ -f "$SERVICE_FILE" ]; then
  90. check_root
  91. systemctl start "$SERVICE_NAME"
  92. if [ $? -eq 0 ]; then
  93. info "服务已启动"
  94. info " FTP端口: 2121"
  95. info " Web管理: http://localhost:8080"
  96. else
  97. error "服务启动失败,查看日志: $0 logs"
  98. exit 1
  99. fi
  100. else
  101. # 前台/后台直接运行
  102. check_exe
  103. info "以后台模式启动..."
  104. cd "$INSTALL_DIR"
  105. nohup "$FTP_EXE" -config "$CONFIG_FILE" >> "$LOG_FILE" 2>&1 &
  106. echo $! > "$PID_FILE"
  107. sleep 1
  108. if kill -0 $(cat "$PID_FILE" 2>/dev/null) 2>/dev/null; then
  109. info "服务已启动 (PID: $(cat $PID_FILE))"
  110. info " FTP端口: 2121"
  111. info " Web管理: http://localhost:8080"
  112. info " 日志文件: $LOG_FILE"
  113. else
  114. error "服务启动失败,查看日志: $LOG_FILE"
  115. rm -f "$PID_FILE"
  116. exit 1
  117. fi
  118. fi
  119. }
  120. # 停止服务
  121. do_stop() {
  122. if [ -f "$SERVICE_FILE" ]; then
  123. check_root
  124. systemctl stop "$SERVICE_NAME"
  125. if [ $? -eq 0 ]; then
  126. info "服务已停止"
  127. else
  128. error "服务停止失败"
  129. exit 1
  130. fi
  131. elif [ -f "$PID_FILE" ]; then
  132. PID=$(cat "$PID_FILE")
  133. if kill -0 "$PID" 2>/dev/null; then
  134. kill "$PID"
  135. sleep 2
  136. if kill -0 "$PID" 2>/dev/null; then
  137. kill -9 "$PID"
  138. fi
  139. rm -f "$PID_FILE"
  140. info "服务已停止 (PID: $PID)"
  141. else
  142. warn "进程 $PID 已不存在"
  143. rm -f "$PID_FILE"
  144. fi
  145. else
  146. # 尝试查找进程
  147. PID=$(pgrep -f "$FTP_EXE")
  148. if [ -n "$PID" ]; then
  149. kill "$PID"
  150. info "服务已停止 (PID: $PID)"
  151. else
  152. warn "服务未在运行"
  153. fi
  154. fi
  155. }
  156. # 重启服务
  157. do_restart() {
  158. do_stop
  159. sleep 2
  160. do_start
  161. }
  162. # 查看状态
  163. do_status() {
  164. if [ -f "$SERVICE_FILE" ]; then
  165. systemctl status "$SERVICE_NAME" --no-pager
  166. elif [ -f "$PID_FILE" ]; then
  167. PID=$(cat "$PID_FILE")
  168. if kill -0 "$PID" 2>/dev/null; then
  169. info "服务运行中 (PID: $PID)"
  170. else
  171. warn "服务未在运行 (PID文件过期)"
  172. rm -f "$PID_FILE"
  173. fi
  174. else
  175. PID=$(pgrep -f "$FTP_EXE")
  176. if [ -n "$PID" ]; then
  177. info "服务运行中 (PID: $PID)"
  178. else
  179. warn "服务未在运行"
  180. fi
  181. fi
  182. }
  183. # 开机自启
  184. do_enable() {
  185. check_root
  186. if [ -f "$SERVICE_FILE" ]; then
  187. systemctl enable "$SERVICE_NAME"
  188. info "已设置开机自启"
  189. else
  190. error "请先运行 '$0 install' 安装服务"
  191. exit 1
  192. fi
  193. }
  194. # 关闭自启
  195. do_disable() {
  196. check_root
  197. if [ -f "$SERVICE_FILE" ]; then
  198. systemctl disable "$SERVICE_NAME"
  199. info "已关闭开机自启"
  200. else
  201. error "服务未安装"
  202. exit 1
  203. fi
  204. }
  205. # 查看日志
  206. do_logs() {
  207. if [ -f "$SERVICE_FILE" ]; then
  208. journalctl -u "$SERVICE_NAME" -f --no-pager -n 50
  209. elif [ -f "$LOG_FILE" ]; then
  210. tail -f "$LOG_FILE"
  211. else
  212. warn "没有可用的日志文件"
  213. fi
  214. }
  215. # 菜单模式
  216. do_menu() {
  217. while true; do
  218. echo ""
  219. echo "========================================"
  220. echo " FTP Server 服务管理工具 (Linux)"
  221. echo "========================================"
  222. echo ""
  223. echo " 1. 安装服务 (systemd)"
  224. echo " 2. 卸载服务"
  225. echo " 3. 启动服务"
  226. echo " 4. 停止服务"
  227. echo " 5. 重启服务"
  228. echo " 6. 查看服务状态"
  229. echo " 7. 开机自启 - 开启"
  230. echo " 8. 开机自启 - 关闭"
  231. echo " 9. 查看运行日志"
  232. echo " 0. 退出"
  233. echo ""
  234. read -p "请输入选项: " choice
  235. case $choice in
  236. 1) do_install ;;
  237. 2) do_uninstall ;;
  238. 3) do_start ;;
  239. 4) do_stop ;;
  240. 5) do_restart ;;
  241. 6) do_status ;;
  242. 7) do_enable ;;
  243. 8) do_disable ;;
  244. 9) do_logs ;;
  245. 0) exit 0 ;;
  246. *) warn "无效选项" ;;
  247. esac
  248. read -p "按 Enter 继续..."
  249. done
  250. }
  251. # 主入口
  252. case "${1:-}" in
  253. install) do_install ;;
  254. uninstall) do_uninstall ;;
  255. start) do_start ;;
  256. stop) do_stop ;;
  257. restart) do_restart ;;
  258. status) do_status ;;
  259. enable) do_enable ;;
  260. disable) do_disable ;;
  261. logs) do_logs ;;
  262. menu|"") do_menu ;;
  263. *)
  264. echo "用法: $0 {install|uninstall|start|stop|restart|status|enable|disable|logs|menu}"
  265. echo ""
  266. echo "命令说明:"
  267. echo " install - 安装为 systemd 服务"
  268. echo " uninstall - 卸载服务"
  269. echo " start - 启动服务"
  270. echo " stop - 停止服务"
  271. echo " restart - 重启服务"
  272. echo " status - 查看服务状态"
  273. echo " enable - 设置开机自启"
  274. echo " disable - 关闭开机自启"
  275. echo " logs - 查看运行日志 (实时)"
  276. echo " menu - 交互式菜单 (默认)"
  277. exit 1
  278. ;;
  279. esac