如何啟動並保持程序在關閉終端後仍持續運行

您好,

我需要在連接到我的 QNAP TS-131P NAS 的終端機中保持一個程序持續運行。問題是:如果我關閉終端機視窗,這個程序就會停止。我已經嘗試了這則訊息中建議的所有方法,但都無法成功,因為 NAS 上沒有安裝這些工具(例如 nohup、screen、tmux 都缺少)……

所以我現在陷入了困境……請問要如何在我的 QNAP NAS 上啟動並保持一個程序即使關閉終端機也能繼續運行?

謝謝。

這裡沒有 nohup 嗎?

https://www.myqnap.org/product/entware-std/

你確定嗎?我曾經放棄過 SSH 連線(不是登出,只是關掉視窗),我以為程序會繼續執行。我可能記錯了,我知道我另一台不同品牌的 NAS 就是這樣。

這是你定期執行的任務嗎?你能不能把它加到系統 crontab 裡,而不是手動執行?
你有試過讓它在背景執行並且 disown(解除關聯)嗎?

https://www.reddit.com/r/linuxquestions/comments/ypkcj6/terminal_how_do_i_run_a_command_send_it_to_the/

這個工作可以在容器中執行嗎?

GNU screen 已包含在 QTS 中。請使用它。:nerd_face:

這裡沒有 nohup 嗎?

謝謝你。我安裝了 Entware-Std qpkg,並輸入了 nohup,但它並未包含在內。不過,tmux 有包含在裡面,我覺得這應該可以解決問題 :slightly_smiling_face:

謝謝你。如我在原始訊息中所說,我的 QNAP NAS 並未包含它。當我輸入 screen 時,會出現「找不到指令」的錯誤訊息。不過,我已經成功安裝了 tmux,應該可以解決我的問題。

是的,這個腳本必須全天候在背景執行。它是一個每15分鐘輪詢伺服器以保持連線的腳本。這是一個 bash 腳本,用來維持 VPN 伺服器的端口轉發功能,是 VPN 伺服器公司提供的。

不行,因為我需要 bash 腳本的初始輸出,它會回傳遠端 VPN 伺服器分配的端口號。crontab 不會提供腳本的輸出,只是執行它。此外,每次執行這個腳本都會回傳新的端口號,我就必須每次都在我的端點應用程式裡更改端口號(這樣很難管理)。

我還沒試過,但我已經把你給的這個頁面收藏了。如果有需要,我會再研究。我已經成功安裝了 Entware-Std,它有附帶 tmux。我目前正在嘗試,似乎終於可以運作了。謝謝你。

謝謝你。是可以的,但我認為不需要,因為我已經成功安裝了 Entware-Std(手動安裝 qpkg)。它有一個叫做 tmux 的工具,看起來即使關閉終端機後也能正常執行我的腳本 :wink:

真為你高興! :smiley:

如我所說,這是隨 QTS 一起提供的。

你是以原始管理員帳號透過 SSH 登入,還是用你自己建立的使用者?如果你使用的是次要帳號,許多指令都需要加上 sudo 前綴。

如果你正確配置腳本,它是可以提供輸出的。我有好幾個腳本都是透過 cron 執行,把輸出寫入日誌檔,或是把輸出透過郵件發送。

所以我隨時都能知道如果有什麼變化,或是有什麼異常。

祝好

我是以原始管理員使用者登入的。

謝謝你。我會保留這個選項,以防萬一。或許會派上用場。

你可以使用以下的指令格式,效果與 nohup 相同:

bash /share/homes/admin/bin/SCRIPT.sh < /dev/null > /dev/null 2>&1 &

「< /dev/null」讓 bash 腳本的輸入從終端機斷開
「> /dev/null」讓 bash 腳本的輸出從終端機斷開
「2>&1」讓 bash 腳本的錯誤訊息從終端機斷開
「&」將腳本放到背景執行。
這基本上就是 nohup 所做的事情。

我在我擁有的 TS-851 QTS 5.2.8.3350 Build 20251216 上測試過這個方法。

嗨,歡迎來到論壇。:slight_smile:

nohup& 執行的是不同的功能。它們甚至可以一起使用。

將程序放到背景執行(backgrounding)並不能保證在用戶斷開終端連線時它不會被終止。

但它確實有效。

可以運作。不過不太可靠。:nerd_face:

嗨,我對 tmux 有很高的期望,但用了一天後它就停止運作了。我上週安裝了 nohup,到目前為止它都沒有停止運作。我的做法如下:

  • 安裝 Entware_1.03std.qpkg
  • 使用套件管理器安裝 nohupopkg install coreutils-nohup
  • 執行你想要的腳本,例如:nohup ./port_forwarding.sh &
  • 如果你需要查看腳本的輸出,執行:vi nohup.out

然後,你可以登出終端機。你的腳本應該還會繼續執行。

'nohup' 完全沒有必要!我這樣做:

./$script.sh &
sleep2
disown -h “%$ID”

其中 ID 是從 1 到 x 的整數,所以
%1 代表第一個啟動的腳本,
%2 代表第二個啟動的腳本,
以此類推。