Linux與命令列基礎
在以 SSH 連線的伺服器上,用「./run.sh &」啟動耗時的處理後中斷連線,結果處理也停止了。要讓處理在中斷連線後繼續執行,最適當的啟動方式是下列何者?
- A./run.sh > run.log 2>&1 &
- Bnice -n 19 ./run.sh > run.log 2>&1 &
- Cnohup ./run.sh > run.log 2>&1 &
查看答案與解析
正確答案:C. nohup ./run.sh > run.log 2>&1 &
連線中斷時,通知終端機掛斷的 SIGHUP 會送給 shell,bash 等 shell 也會把 SIGHUP 送給自己的工作。收到 SIGHUP 時的預設動作是結束,所以背景的工作也會停止。nohup 會讓指令以忽略 SIGHUP 的方式啟動,只要把輸出導向檔案,中斷連線後處理仍會繼續。若從終端機啟動而沒有重新導向輸出,nohup 會把輸出寫入名為 nohup.out 的檔案。使用 tmux 或 screen 等工具,讓終端機的工作階段留在伺服器上,之後再重新連回同一個畫面的方法也很常見。
- A. 即使把輸出導向檔案,收到 SIGHUP 時處理仍會結束。
- B. nice -n 19 只是以較低的優先順序啟動,對 SIGHUP 的反應並不會改變。
- C. 正確。用 nohup 讓它忽略 SIGHUP,輸出則保留在檔案中。