Go項目關閉終端后停止運行的3種實用解決方案
引言
在Go項目部署過程中,很多開發(fā)者都會遇到一個共性問題:通過終端啟動程序后,一旦關閉終端,程序就會隨之停止運行。這本質(zhì)上是因為程序運行在前臺進程中,終端作為父進程被關閉時,子進程會被系統(tǒng)終止。本文將介紹3種可靠方案,徹底解決這一問題,確保Go程序在服務器上穩(wěn)定運行。
一、問題根源:前臺進程與終端的依賴關系
當我們通過./shuha(假設程序名為shuha)直接啟動Go程序時,程序會作為前臺進程運行,其生命周期與終端綁定:
- 終端關閉時,系統(tǒng)會向關聯(lián)的所有進程發(fā)送
SIGHUP(掛起信號) - 前臺進程收到該信號后會默認終止運行
- 這就是為什么關閉終端后程序會停止的核心原因
二、解決方案詳解
方案1:使用nohup命令(最簡單直接)
nohup(no hang up)命令的作用是忽略終端關閉時發(fā)送的SIGHUP信號,讓程序脫離終端獨立運行,同時將輸出日志重定向到文件。
操作步驟:
進入程序目錄
cd /www/wwwroot/auth-shuha-api # 替換為你的項目路徑
創(chuàng)建日志目錄(可選但推薦)
為避免日志散落在項目根目錄,建議創(chuàng)建專門的日志文件夾:
mkdir -p logs # 創(chuàng)建logs目錄 chmod 755 logs # 賦予讀寫權限
后臺啟動程序
nohup ./shuha > logs/run.log 2>&1 &
命令解析:
nohup:忽略終端關閉信號./shuha:啟動Go程序> logs/run.log:將標準輸出(stdout)寫入日志文件2>&1:將錯誤輸出(stderr)合并到標準輸出,統(tǒng)一寫入日志&:將程序放入后臺運行
驗證程序是否運行
ps -ef | grep shuha # 查看進程
若輸出包含./shuha,說明程序已在后臺穩(wěn)定運行。
查看實時日志
tail -f logs/run.log # 實時監(jiān)控日志輸出
停止程序(如需)
先通過ps命令獲取進程ID(PID),再用kill終止:
ps -ef | grep shuha # 找到進程ID(第二列數(shù)字) kill -9 12345 # 替換12345為實際PID
方案2:使用screen創(chuàng)建虛擬終端(適合頻繁調(diào)試)
screen是一款終端復用工具,可創(chuàng)建獨立的虛擬終端會話。關閉終端后,會話仍在后臺運行,重新連接終端后可恢復會話繼續(xù)操作。
操作步驟:
安裝screen(首次使用)
CentOS系統(tǒng):
yum install -y screen
Ubuntu/Debian系統(tǒng):
apt-get install -y screen
創(chuàng)建新會話
screen -S go_shuha # 創(chuàng)建名為go_shuha的會話(名稱可自定義)
執(zhí)行后會進入一個全新的虛擬終端。
啟動程序
在虛擬終端中正常啟動Go程序:
cd /www/wwwroot/auth-shuha-api ./shuha # 前臺啟動(可直接看到輸出日志)
脫離會話(保持程序運行)
按Ctrl + A后再按D(先按Ctrl+A,松開后按D),此時會回到原終端,程序在虛擬會話中繼續(xù)運行。
重新連接會話
關閉終端后,再次登錄服務器,執(zhí)行以下命令恢復會話:
screen -r go_shuha # 重新進入名為go_shuha的會話
終止程序與會話
- 在會話中按
Ctrl + C終止程序 - 輸入
exit可關閉當前虛擬會話
方案3:使用systemd配置系統(tǒng)服務(最穩(wěn)定,推薦生產(chǎn)環(huán)境)
將Go程序注冊為系統(tǒng)服務,可通過systemctl命令管理,支持開機自啟,是生產(chǎn)環(huán)境的最佳選擇。
操作步驟:
創(chuàng)建服務配置文件
vim /etc/systemd/system/shuha.service # 用vim編輯服務文件
寫入配置內(nèi)容
按i進入編輯模式,粘貼以下內(nèi)容(根據(jù)實際路徑修改):
[Unit] Description=Auth Shuha API Service # 服務描述 After=network.target mysql.service # 依賴網(wǎng)絡和MySQL服務(可選) [Service] User=root # 運行用戶(建議用非root用戶,如www) WorkingDirectory=/www/wwwroot/auth-shuha-api # 程序目錄 ExecStart=/www/wwwroot/auth-shuha-api/shuha # 程序絕對路徑 Restart=always # 程序崩潰時自動重啟 RestartSec=3 # 重啟間隔3秒 StandardOutput=append:/www/wwwroot/auth-shuha-api/logs/run.log # 標準輸出日志 StandardError=append:/www/wwwroot/auth-shuha-api/logs/error.log # 錯誤日志 [Install] WantedBy=multi-user.target # 多用戶模式下啟動
按Esc后輸入:wq保存退出。
刷新系統(tǒng)服務
systemctl daemon-reload # 重新加載服務配置
啟動服務
systemctl start shuha # 啟動服務
設置開機自啟(可選)
systemctl enable shuha # 開機自動啟動
服務管理常用命令
systemctl status shuha # 查看服務狀態(tài) systemctl stop shuha # 停止服務 systemctl restart shuha # 重啟服務 journalctl -u shuha # 查看系統(tǒng)日志(包含服務啟動信息)
三、方案對比與選擇建議
| 方案 | 優(yōu)點 | 缺點 | 適用場景 |
|---|---|---|---|
| nohup | 簡單易用,無需額外配置 | 無開機自啟,管理不夠規(guī)范 | 臨時測試、短期運行 |
| screen | 支持會話恢復,適合調(diào)試 | 配置稍復雜,不支持開機自啟 | 開發(fā)環(huán)境、需要頻繁交互的場景 |
| systemd | 穩(wěn)定可靠,支持開機自啟和重啟 | 配置相對復雜 | 生產(chǎn)環(huán)境、長期運行的服務 |
四、常見問題排查
程序后臺運行后無法訪問
- 檢查程序是否監(jiān)聽
0.0.0.0(而非127.0.0.1),確保外部可訪問 - 確認服務器防火墻和云安全組已開放程序端口(如8080)
日志文件無內(nèi)容
- 檢查日志目錄權限是否正確(程序是否有寫入權限)
- 確認啟動命令中的日志路徑與程序?qū)嶋H輸出路徑一致
systemd服務啟動失敗
- 用
systemctl status shuha查看具體錯誤 - 檢查
ExecStart路徑是否正確,程序是否有執(zhí)行權限(chmod +x shuha)
通過以上方案,可徹底解決Go程序關閉終端后停止運行的問題。根據(jù)實際場景選擇合適的方案,既能保證程序穩(wěn)定運行,又能簡化管理成本。生產(chǎn)環(huán)境優(yōu)先推薦systemd方案,兼顧穩(wěn)定性和可維護性。
以上就是Go項目關閉終端后停止運行的3種實用解決方案的詳細內(nèi)容,更多關于Go關閉終端后停止運行的資料請關注腳本之家其它相關文章!
相關文章
Golang中fsnotify包監(jiān)聽文件變化的原理詳解
Golang提供了一個強大的fsnotify包,它能夠幫助我們輕松實現(xiàn)文件系統(tǒng)的監(jiān)控,本文將深入探討fsnotify包的原理,感興趣的小伙伴可以跟隨小編一起學習一下2023-12-12
解決golang post文件時Content-Type出現(xiàn)的問題
這篇文章主要介紹了解決golang post文件時Content-Type出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05

