install_autostart.sh 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #!/bin/bash
  2. # 显示帮助信息
  3. show_help() {
  4. echo "用法: sudo ./install_autostart.sh [可执行文件路径] [可选:服务名称]"
  5. echo "示例: sudo ./install_autostart.sh ./myapp myapp_service" # 支持相对路径
  6. echo "示例: sudo ./install_autostart.sh /home/user/app" # 支持绝对路径
  7. echo "说明:"
  8. echo " 第一个参数: 可执行文件的路径(相对路径或绝对路径均可)"
  9. echo " 第二个参数: 可选,自定义服务名称(默认使用文件名)"
  10. }
  11. # 检查参数是否正确
  12. if [ $# -lt 1 ]; then
  13. echo "错误:请提供可执行文件的路径!"
  14. show_help
  15. exit 1
  16. fi
  17. # 解析参数并转换为绝对路径
  18. INPUT_PATH="$1"
  19. # 将传入的路径(无论相对/绝对)转换为绝对路径
  20. EXECUTABLE_PATH=$(realpath "$INPUT_PATH")
  21. # 检查转换后的路径是否存在
  22. if [ ! -f "$EXECUTABLE_PATH" ]; then
  23. echo "错误:文件 $INPUT_PATH(转换后路径:$EXECUTABLE_PATH)不存在!"
  24. exit 1
  25. fi
  26. # 检查文件是否可执行,不可执行则添加权限
  27. if [ ! -x "$EXECUTABLE_PATH" ]; then
  28. echo "警告:文件 $EXECUTABLE_PATH 没有执行权限,正在添加..."
  29. chmod +x "$EXECUTABLE_PATH" || {
  30. echo "错误:无法为 $EXECUTABLE_PATH 添加执行权限!"
  31. exit 1
  32. }
  33. fi
  34. # 配置服务参数
  35. APP_NAME="${2:-$(basename "$EXECUTABLE_PATH")}" # 服务名默认使用文件名
  36. APP_DESCRIPTION="Auto-start service for $APP_NAME"
  37. RUN_USER=$(whoami)
  38. WORKING_DIR=$(dirname "$EXECUTABLE_PATH") # 工作目录为可执行文件所在目录
  39. SERVICE_FILE="/etc/systemd/system/$APP_NAME.service"
  40. # 创建 systemd 服务文件(使用转换后的绝对路径)
  41. echo "正在创建服务文件: $SERVICE_FILE"
  42. sudo tee "$SERVICE_FILE" > /dev/null << EOF
  43. [Unit]
  44. Description=$APP_DESCRIPTION
  45. After=network.target
  46. [Service]
  47. User=$RUN_USER
  48. WorkingDirectory=$WORKING_DIR
  49. ExecStart=$EXECUTABLE_PATH # 使用绝对路径
  50. Restart=always
  51. RestartSec=5
  52. [Install]
  53. WantedBy=multi-user.target
  54. EOF
  55. # 设置服务文件权限
  56. sudo chmod 644 "$SERVICE_FILE"
  57. # 启用并启动服务
  58. echo "重新加载系统服务配置..."
  59. sudo systemctl daemon-reload
  60. echo "启用开机自启..."
  61. sudo systemctl enable "$APP_NAME.service"
  62. echo "启动服务..."
  63. sudo systemctl start "$APP_NAME.service"
  64. # 验证服务状态
  65. echo -e "\n服务状态验证:"
  66. sudo systemctl status "$APP_NAME.service" --no-pager
  67. echo -e "\n----------------------------------------"
  68. echo "操作完成!程序已配置为开机自启。"
  69. echo "服务名称: $APP_NAME"
  70. echo "可执行文件绝对路径: $EXECUTABLE_PATH"
  71. echo "管理命令:"
  72. echo " 启动: sudo systemctl start $APP_NAME.service"
  73. echo " 停止: sudo systemctl stop $APP_NAME.service"
  74. echo " 重启: sudo systemctl restart $APP_NAME.service"
  75. echo " 查看日志: sudo journalctl -u $APP_NAME.service -f"
  76. echo " 移除自启: sudo systemctl disable $APP_NAME.service"