--- 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
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.