Try   HackMD

緣由

通常使用ssh連線後,當關閉ssh時,通常正在執行的程式都會中斷,
為了讓需要長時間執行的程式可以持續執行,
因此需要透過背景執行來延續

有兩種方法可以實現此需求: nohup、screen

方法一:nohup

操作方式

  1. 將要執行的語法放到腳本中
    $ vi backup.sh
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →
  2. 加入執行權限
    $ chmod +x backup.sh
  3. 透過nohup來進行背景執行(最後面的&不能省略)
    $ nohup ./backup.sh > foo.out 2> foo.err &
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
若需要sudo執行:

  1. 請先提權後再執行nohup,不然會卡在輸入密碼的沒往下執行。
  2. 提權方法很多,比如說先執行 sudo ls,執行啥都不重要,只是為了提權。

速查表

指令 說明
nohup <command> & 將指定命令在背景執行
nohup:避免關閉ssh就終止
&:背景執行
ctrl + Z (不常用)將『目前』的工作丟到背景中『暫停』。
可配合jobs查到工作編號,透過 bg %n 將指定編號的工作恢復執行
jobs 查看目前背景執行清單
fg %j 把背景工作拿到前景處理,%j 表示jobs的編號 j 的工作項目
bg %j 將暫停的任務開始運行,%j 表示jobs的編號 j 的工作項目

說明-背景執行與登出不中斷

使用 ampersand (&) 讓程式在背景執行

$ command &
  • 在執行command後面加上&,即可讓程式在背景執行。
  • 但是當Linux送出SIGHUP訊號時,程式就會終止。
  • 一般來說,當退出terminal時,Linux就會送出SIGHUP訊號,而使用nohup可以避免這個情況。

使用nohup避免程式因為SIGHUP訊號而中止

$ nohup command &
  • 指令: nohup <執行的command> &

為何nohup後面還要加上& ?

  • nohup:把SIGHUP訊號攔截並且避免程式因此而中止
  • &:讓程式在背景執行

說明-輸出儲存到檔案

因背景執行後就看不到輸出結果,
因此建議儲存到檔案中,

可參考上方指令,
有兩個地方可將輸出儲存到檔案,
兩個位置擇一即可

  1. 在您的腳本內
  2. 在呼叫腳本的nohup指令最後面

寫入指令有兩種,擇一即可,在指定位置的最後面加上即可

  1. OOOO >> log.txt 2>&1
    正常輸出(&1)的寫入log.txt,錯誤輸出(&2)的寫入正常輸出(&1)中,即正常輸出與錯誤輸出都寫入log.txt中
  2. OOOO > foo.out 2> foo.err
    正常輸出(&1)的寫入foo.out,錯誤輸出(&2)的寫入foo.err

確認背景執行

關閉現有ssh,重新連線,

確認方法一:

重新登入後,執行指令jobs沒看到任務,
不過可以看ps -aux | grep backup看到任務正在執行

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

確認方法二:

因我的腳本會產生log,
查看log大小發現有持續在增加,
確認本方法是可行的

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

方法二:screen

操作方式

要在關閉 PuTTY 後,讓 MySQL 還原程序在背景繼續執行,可以使用 screen 這個工具。以下是具體步驟:

  1. 確認是否已安裝 screen
    在 PuTTY 終端機中輸入 screen。如果出現 "bash: screen: command not found" 類似的訊息,表示尚未安裝。使用以下指令安裝:
    sudo apt-get install screen
  2. 啟動 screen
    輸入 screen 指令來啟動一個新的 screen session
  3. 執行指令
    screen 視窗中,執行你的指令。
  4. 分離 screen session
    按下 Ctrl + a,然後放開,再按下 d。這會將目前的 screen 視窗放到背景執行,並與 PuTTY 的連線中斷。 PuTTY 視窗會顯示 "detached from tty",表示已成功分離。
  5. 關閉 PuTTY
    現在可以安全地關閉 PuTTY 視窗,程序會在背景繼續執行。
  6. 重新連線並檢視執行狀況 (如果需要)
    screen -ls
    這會顯示所有正在執行的 screen 視窗,以及它們的 ID。
  7. 若要回到先前的 screen 視窗,輸入以下指令,將 xxxxx 替換為你要回到的視窗 ID:
    screen -r xxxxx
    回到 screen 視窗後,可以檢視指令運行狀況。
  8. 關閉背景程序 (如果需要)
    兩種做法:
    • 重新連接到screen視窗,輸入exit退出該窗口。
    • 使用screen -ls查看所有後台窗口,最前面的數字是pid,使用kill xxxxx指令關閉程序 (xxxxx替換為你要關閉的程序)。

這樣就能確保程序在你關閉 PuTTY 後仍然可以繼續執行

速查表

指令 用途
screen -ls 這會顯示所有正在執行的screen視窗,以及它們的ID(ID的最前面數字是pid)
screen -r [screen ID / PID] 回到上一個或指定的screen視窗
按下 Ctrl + a,然後放開,再按下 d 將目前的 screen 視窗放到背景執行
exit 結束當前screen

參考資料

https://blog.gtwang.org/linux/linux-nohup-command-tutorial/
https://cancerpio.medium.com/linux指令懶人包-nohup-redirecting-output等常用指令-71a0bec0a38