--- tags: bash, linux, nohup, 背景執行 --- # 緣由 通常使用ssh連線後,當關閉ssh時,通常正在執行的程式都會中斷, 為了讓需要長時間執行的程式可以持續執行, 因此需要透過背景執行來延續 有兩種方法可以實現此需求: nohup、screen # 方法一:nohup ## 操作方式 1. 將要執行的語法放到腳本中 `$ vi backup.sh`  2. 加入執行權限 `$ chmod +x backup.sh` 3. 透過nohup來進行背景執行(最後面的`&`不能省略) `$ nohup ./backup.sh > foo.out 2> foo.err &`  :::warning :bulb: **若需要sudo執行**: 1. 請先提權後再執行nohup,不然會卡在輸入密碼的沒往下執行。 2. 提權方法很多,比如說先執行 `sudo ls`,執行啥都不重要,只是為了提權。 ::: ## 速查表 |指令|說明| |---|---| |`nohup <command> &`|將指定命令在背景執行<br>`nohup`:避免關閉ssh就終止<br>`&`:背景執行| |`ctrl + Z`|(不常用)將『目前』的工作丟到背景中『暫停』。<br>可配合`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`看到任務正在執行  ### 確認方法二: 因我的腳本會產生log, 查看log大小發現有持續在增加, 確認本方法是可行的  # 方法二: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` 視窗後,可以檢視指令運行狀況。 7. 關閉背景程序 (如果需要) 兩種做法: - 重新連接到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
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up