From 2b1d3e73475ed160e6f58ffd8d08c01c9acb5ca7 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Fri, 20 Feb 2026 00:03:16 +0100 Subject: [PATCH] [feat] restart xray-core from cli #3825 --- main.go | 8 +++++- web/web.go | 4 +++ x-ui.rc | 5 ++++ x-ui.service.arch | 1 + x-ui.service.debian | 1 + x-ui.service.rhel | 1 + x-ui.sh | 68 ++++++++++++++++++++++++++++----------------- 7 files changed, 62 insertions(+), 26 deletions(-) diff --git a/main.go b/main.go index 8096616c..bc17aad6 100644 --- a/main.go +++ b/main.go @@ -70,7 +70,7 @@ func runWebServer() { sigCh := make(chan os.Signal, 1) // Trap shutdown signals - signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGTERM) + signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGTERM, syscall.SIGUSR1) for { sig := <-sigCh @@ -108,6 +108,12 @@ func runWebServer() { return } log.Println("Sub server restarted successfully.") + case syscall.SIGUSR1: + logger.Info("Received USR1 signal, restarting xray-core...") + err := server.RestartXray() + if err != nil { + logger.Error("Failed to restart xray-core:", err) + } default: // --- FIX FOR TELEGRAM BOT CONFLICT (409) on full shutdown --- diff --git a/web/web.go b/web/web.go index 300572a3..71845a14 100644 --- a/web/web.go +++ b/web/web.go @@ -490,3 +490,7 @@ func (s *Server) GetCron() *cron.Cron { func (s *Server) GetWSHub() any { return s.wsHub } + +func (s *Server) RestartXray() error { + return s.xrayService.RestartXray(true) +} diff --git a/x-ui.rc b/x-ui.rc index 1323d76a..cfb54211 100644 --- a/x-ui.rc +++ b/x-ui.rc @@ -10,4 +10,9 @@ depend() { } start_pre(){ cd /usr/local/x-ui +} +reload() { + ebegin "Reloading ${RC_SVCNAME}" + kill -USR1 $pidfile + eend $? } \ No newline at end of file diff --git a/x-ui.service.arch b/x-ui.service.arch index b6e01141..9060fbf6 100644 --- a/x-ui.service.arch +++ b/x-ui.service.arch @@ -9,6 +9,7 @@ Environment="XRAY_VMESS_AEAD_FORCED=false" Type=simple WorkingDirectory=/usr/lib/x-ui/ ExecStart=/usr/lib/x-ui/x-ui +ExecReload=kill -USR1 $MAINPID Restart=on-failure RestartSec=5s diff --git a/x-ui.service.debian b/x-ui.service.debian index 037f88bb..4902c5fe 100644 --- a/x-ui.service.debian +++ b/x-ui.service.debian @@ -9,6 +9,7 @@ Environment="XRAY_VMESS_AEAD_FORCED=false" Type=simple WorkingDirectory=/usr/local/x-ui/ ExecStart=/usr/local/x-ui/x-ui +ExecReload=kill -USR1 $MAINPID Restart=on-failure RestartSec=5s diff --git a/x-ui.service.rhel b/x-ui.service.rhel index 30652d52..696a9c12 100644 --- a/x-ui.service.rhel +++ b/x-ui.service.rhel @@ -9,6 +9,7 @@ Environment="XRAY_VMESS_AEAD_FORCED=false" Type=simple WorkingDirectory=/usr/local/x-ui/ ExecStart=/usr/local/x-ui/x-ui +ExecReload=kill -USR1 $MAINPID Restart=on-failure RestartSec=5s diff --git a/x-ui.sh b/x-ui.sh index 2bd125ab..933a964e 100644 --- a/x-ui.sh +++ b/x-ui.sh @@ -408,6 +408,16 @@ restart() { fi } +restart_xray() { + systemctl reload x-ui + LOGI "xray-core Restart signal sent successfully, Please check the log information to confirm whether xray restarted successfully" + sleep 2 + show_xray_status + if [[ $# == 0 ]]; then + before_show_menu + fi +} + status() { if [[ $release == "alpine" ]]; then rc-service x-ui status @@ -2154,6 +2164,7 @@ show_usage() { │ ${blue}x-ui start${plain} - Start │ │ ${blue}x-ui stop${plain} - Stop │ │ ${blue}x-ui restart${plain} - Restart │ +| ${blue}x-ui restart-xray${plain} - Restart Xray │ │ ${blue}x-ui status${plain} - Current Status │ │ ${blue}x-ui settings${plain} - Current Settings │ │ ${blue}x-ui enable${plain} - Enable Autostart on OS Startup │ @@ -2189,25 +2200,26 @@ show_menu() { │ ${green}11.${plain} Start │ │ ${green}12.${plain} Stop │ │ ${green}13.${plain} Restart │ -│ ${green}14.${plain} Check Status │ -│ ${green}15.${plain} Logs Management │ +| ${green}14.${plain} Restart Xray │ +│ ${green}15.${plain} Check Status │ +│ ${green}16.${plain} Logs Management │ │────────────────────────────────────────────────│ -│ ${green}16.${plain} Enable Autostart │ -│ ${green}17.${plain} Disable Autostart │ +│ ${green}17.${plain} Enable Autostart │ +│ ${green}18.${plain} Disable Autostart │ │────────────────────────────────────────────────│ -│ ${green}18.${plain} SSL Certificate Management │ -│ ${green}19.${plain} Cloudflare SSL Certificate │ -│ ${green}20.${plain} IP Limit Management │ -│ ${green}21.${plain} Firewall Management │ -│ ${green}22.${plain} SSH Port Forwarding Management │ +│ ${green}19.${plain} SSL Certificate Management │ +│ ${green}20.${plain} Cloudflare SSL Certificate │ +│ ${green}21.${plain} IP Limit Management │ +│ ${green}22.${plain} Firewall Management │ +│ ${green}23.${plain} SSH Port Forwarding Management │ │────────────────────────────────────────────────│ -│ ${green}23.${plain} Enable BBR │ -│ ${green}24.${plain} Update Geo Files │ -│ ${green}25.${plain} Speedtest by Ookla │ +│ ${green}24.${plain} Enable BBR │ +│ ${green}25.${plain} Update Geo Files │ +│ ${green}26.${plain} Speedtest by Ookla │ ╚────────────────────────────────────────────────╝ " show_status - echo && read -rp "Please enter your selection [0-25]: " num + echo && read -rp "Please enter your selection [0-26]: " num case "${num}" in 0) @@ -2253,43 +2265,46 @@ show_menu() { check_install && restart ;; 14) - check_install && status + check_install && restart_xray ;; 15) - check_install && show_log + check_install && status ;; 16) - check_install && enable + check_install && show_log ;; 17) - check_install && disable + check_install && enable ;; 18) - ssl_cert_issue_main + check_install && disable ;; 19) - ssl_cert_issue_CF + ssl_cert_issue_main ;; 20) - iplimit_main + ssl_cert_issue_CF ;; 21) - firewall_menu + iplimit_main ;; 22) - SSH_port_forwarding + firewall_menu ;; 23) - bbr_menu + SSH_port_forwarding ;; 24) - update_geo + bbr_menu ;; 25) + update_geo + ;; + 26) run_speedtest ;; *) - LOGE "Please enter the correct number [0-25]" + LOGE "Please enter the correct number [0-26]" ;; esac } @@ -2305,6 +2320,9 @@ if [[ $# > 0 ]]; then "restart") check_install 0 && restart 0 ;; + "restart-xray") + check_install 0 && restart_xray 0 + ;; "status") check_install 0 && status 0 ;;