進(jìn)程與作業(yè)執(zhí)行完畢后再繼續(xù)(bash 內(nèi)建命令))
文檔教程【免費(fèi)下載鏈接】linux-commandLinux命令大全搜索工具內(nèi)容包含Linux命令手冊(cè)、詳解、學(xué)習(xí)、搜集。https://git.io/linux項(xiàng)目地址https://gitcode.com/GitHub_Trending/linux/linux-command點(diǎn)擊查看免費(fèi)下載wait是 bash 內(nèi)置的作業(yè)控制命令用于阻塞當(dāng)前 shell直到指定的后臺(tái)進(jìn)程或作業(yè)執(zhí)行完畢后才返回。本文以 command/wait.md 為核心系統(tǒng)講解wait的語(yǔ)法、參數(shù)、典型用法并結(jié)合 command/jobs.md、command/bg.md、command/fg.md、command/disown.md 等作業(yè)控制命令給出 shell 腳本中可復(fù)制、可運(yùn)行的實(shí)戰(zhàn)示例。讀完本文你將掌握如何用wait精確控制后臺(tái)任務(wù)的完成時(shí)機(jī)編寫(xiě)可靠的多進(jìn)程并行腳本。wait 命令是什么wait是一個(gè) bash 內(nèi)建命令builtin它的作用是等待指定進(jìn)程或作業(yè)執(zhí)行完畢直到其結(jié)束運(yùn)行后才繼續(xù)執(zhí)行后續(xù)命令。這在 shell 腳本編程中非常常見(jiàn)當(dāng)腳本先后臺(tái)啟動(dòng)了多個(gè)任務(wù)又需要在所有或某個(gè)任務(wù)完成后才能進(jìn)行下一步處理時(shí)wait就是最直接的工具。與sleep按指定時(shí)長(zhǎng)暫停見(jiàn) command/sleep.md不同wait不是等多久而是等什么——它不依賴固定的時(shí)間而是以目標(biāo)進(jìn)程/作業(yè)的實(shí)際完成時(shí)刻為邊界。只要目標(biāo)沒(méi)有結(jié)束調(diào)用wait的 shell 就會(huì)一直阻塞。一個(gè)關(guān)鍵規(guī)則原文檔明確強(qiáng)調(diào)使用wait等待作業(yè)時(shí)作業(yè)標(biāo)識(shí)號(hào)前必須添加百分號(hào)%例如wait %1而等待進(jìn)程時(shí)則直接寫(xiě)進(jìn)程號(hào)PID例如wait 27156。語(yǔ)法與參數(shù)原文檔給出的語(yǔ)法為wait(參數(shù))其參數(shù)是進(jìn)程或作業(yè)標(biāo)示既可以指定進(jìn)程號(hào)PID也可以指定作業(yè)號(hào)jobspec。從 bash 的完整形式看wait還可接收多個(gè)參數(shù)并支持可選選項(xiàng)wait [-fn] [jobspec ... | pid ...]jobspec作業(yè)標(biāo)識(shí)符等待對(duì)應(yīng)作業(yè)完成。等待作業(yè)時(shí)必須在作業(yè)號(hào)前加%如wait %1。pid進(jìn)程號(hào)等待該進(jìn)程完成如wait 27156。若不提供任何參數(shù)則等待當(dāng)前 shell 的所有后臺(tái)任務(wù)全部完成這也是腳本中最常用的形式。-f與-n等選項(xiàng)用于調(diào)整等待行為不同 bash 版本細(xì)節(jié)略有差異可通過(guò)help wait查看當(dāng)前環(huán)境的完整說(shuō)明。wait的返回值是被等待進(jìn)程/作業(yè)的退出狀態(tài)exit status如果目標(biāo)進(jìn)程是被信號(hào)終止的則返回128 信號(hào)編號(hào)若發(fā)生錯(cuò)誤如指定的作業(yè)或進(jìn)程不存在則返回失敗狀態(tài)。實(shí)戰(zhàn)等待指定作業(yè)完成%作業(yè)號(hào)原文檔給出的第一個(gè)實(shí)例是等待作業(yè)號(hào)為 1 的作業(yè)完成。首先在后臺(tái)運(yùn)行一個(gè)sleep進(jìn)程sleep 10s [1] 27156命令執(zhí)行后輸出[1] 27156其中[1]是作業(yè)號(hào)job number27156是后臺(tái)進(jìn)程的PID。隨后使用wait指定作業(yè)號(hào)等待它完成wait %1 #等待作業(yè)號(hào)為1的作業(yè)完成 [1] Done sleep 10s注意wait %1中作業(yè)號(hào)前加了%這是等待作業(yè)與等待進(jìn)程在寫(xiě)法上的核心區(qū)別。sleep 10s結(jié)束后shell 輸出[1] Done sleep 10s的完成通知wait隨即返回。實(shí)戰(zhàn)等待指定進(jìn)程完成PID除了作業(yè)號(hào)wait也接受進(jìn)程號(hào)。原文檔給出的第二種用法wait 27156 [1] Done sleep 10s這里直接傳入后臺(tái)任務(wù)的 PID27156效果與wait %1等價(jià)——兩者指向同一個(gè)后臺(tái)任務(wù)只是標(biāo)識(shí)方式不同。在腳本中更常見(jiàn)的寫(xiě)法是使用$!自動(dòng)獲取最近一個(gè)后臺(tái)進(jìn)程的 PID無(wú)需手動(dòng)記錄#!/bin/bash ./long_task.sh pid$! # $! 保存剛啟動(dòng)的后臺(tái)進(jìn)程 PID wait $pid # 等待該任務(wù)完成 echo 任務(wù)已結(jié)束實(shí)戰(zhàn)等待所有后臺(tái)任務(wù)完成不指定任何參數(shù)時(shí)wait會(huì)等待當(dāng)前 shell 啟動(dòng)的所有后臺(tái)任務(wù)全部結(jié)束。這在并行啟動(dòng)多個(gè)任務(wù)、統(tǒng)一收尾的場(chǎng)景中非常實(shí)用#!/bin/bash # 同時(shí)啟動(dòng)三個(gè)后臺(tái)任務(wù) sleep 5 sleep 3 sleep 8 # 阻塞直到上面三個(gè)任務(wù)全部完成 wait echo 全部后臺(tái)任務(wù)執(zhí)行完畢腳本會(huì)在此處停留約 8 秒取決于最后一個(gè)任務(wù)隨后輸出全部后臺(tái)任務(wù)執(zhí)行完畢。這正是原文檔所說(shuō)待指定的指令執(zhí)行完成后才會(huì)繼續(xù)執(zhí)行后面的任務(wù)的典型體現(xiàn)。等待的返回值與信號(hào)語(yǔ)義wait返回被等待目標(biāo)的退出狀態(tài)因此它還可以作為腳本分支判斷的依據(jù)。例如#!/bin/bash curl -s https://example.com/data.json data.json wait $! echo 下載成功 || echo 下載失敗退出碼 $?當(dāng)后臺(tái)任務(wù)因收到信號(hào)而終止時(shí)wait返回128 信號(hào)編號(hào)。這與 command/kill.md 中介紹的信號(hào)機(jī)制一致例如任務(wù)被SIGKILL信號(hào) 9殺死wait返回 137。利用這一特性可以識(shí)別后臺(tái)任務(wù)是被正常退出還是被信號(hào)中斷。與作業(yè)控制命令的配合使用wait并非孤立存在它屬于 bash 的作業(yè)控制命令家族。bash 的作業(yè)控制命令包括bg、fg、kill、wait、disown、suspend這一結(jié)論在 command/jobs.md、command/bg.md、command/fg.md 等文檔中反復(fù)出現(xiàn)它們共同構(gòu)成了對(duì)前后臺(tái)任務(wù)的管理閉環(huán)命令作用倉(cāng)庫(kù)文檔jobs顯示當(dāng)前 shell 的作業(yè)狀態(tài)-l可同時(shí)列出 PID-r/-s篩選運(yùn)行/停止?fàn)顟B(tài)command/jobs.mdbg將暫停Stopped的作業(yè)放到后臺(tái)繼續(xù)運(yùn)行等價(jià)于命令末尾加command/bg.mdfg將后臺(tái)作業(yè)調(diào)回前臺(tái)終端運(yùn)行command/fg.mdwait阻塞等待指定作業(yè)/進(jìn)程完成command/wait.mddisown從當(dāng)前 shell 的作業(yè)表中移除作業(yè)避免 shell 退出時(shí)連帶結(jié)束任務(wù)command/disown.mdsuspend掛起當(dāng)前 shell 的執(zhí)行直到收到SIGCONT信號(hào)command/suspend.mdkill向作業(yè)或進(jìn)程發(fā)送信號(hào)如STOP、CONT、KILLcommand/kill.md完整的協(xié)作流程通常是用sleep 60 啟動(dòng)后臺(tái)任務(wù)或用CtrlZ將前臺(tái)任務(wù)暫停用jobs -l查看作業(yè)號(hào)與對(duì)應(yīng) PID輸出格式參見(jiàn) command/jobs.md用bg %1/fg %1調(diào)整前后臺(tái)狀態(tài)用wait %1或wait PID等待其結(jié)束如需讓任務(wù)脫離 shell 生命周期管理可用disown。例如先暫停一個(gè)前臺(tái)任務(wù)再恢復(fù)并等待sleep 60 ^Z [1] Stopped sleep 60 bg %1 # 讓作業(yè)1在后臺(tái)繼續(xù)運(yùn)行 [1] sleep 60 wait %1 # 等待作業(yè)1完成注意wait只能等待當(dāng)前 shell 的作業(yè)/子進(jìn)程。經(jīng)過(guò)disown移出作業(yè)表、或被其他進(jìn)程收養(yǎng)的任務(wù)不再受當(dāng)前 shell 的wait管轄這也是 command/disown.md 示例中移除作業(yè)后任務(wù)仍繼續(xù)運(yùn)行的原因所在。在 shell 腳本中的典型應(yīng)用場(chǎng)景一并行任務(wù)統(tǒng)一收尾如多文件并行下載、并行編譯。#!/bin/bash for url in $(cat urls.txt); do wget -q $url done wait # 等待所有下載完成 echo 全部下載完成場(chǎng)景二以退出碼驅(qū)動(dòng)后續(xù)邏輯。#!/bin/bash run_backup backup_pid$! wait $backup_pid if [ $? -eq 0 ]; then echo 備份成功繼續(xù)后續(xù)操作 else echo 備份失敗終止流程 exit 1 fi場(chǎng)景三用sleep演示延時(shí)任務(wù)與wait的組合sleep支持2s/2m/2h/2d/infinity等時(shí)間后綴詳見(jiàn) command/sleep.md#!/bin/bash sleep 2 wait $! echo 2 秒延時(shí)結(jié)束使用前提與注意事項(xiàng)作業(yè)號(hào)前必須加%等待作業(yè)寫(xiě)wait %1等待進(jìn)程寫(xiě)wait 27156兩者不能混淆。這是原文檔特別強(qiáng)調(diào)的規(guī)則。需要開(kāi)啟作業(yè)控制bash 的作業(yè)控制命令依賴set選項(xiàng)monitor處于開(kāi)啟狀態(tài)??捎胹et -o查看monitor行確認(rèn)用set -o monitor或set -m開(kāi)啟command/jobs.md 的注意事項(xiàng)中給出了相同說(shuō)明。wait是內(nèi)建命令幫助信息可通過(guò)help wait查看它屬于 bash 內(nèi)建命令體系而不是獨(dú)立的外部程序。退出狀態(tài)語(yǔ)義wait返回被等待目標(biāo)的退出狀態(tài)目標(biāo)被信號(hào)終止時(shí)返回128 信號(hào)編號(hào)。只能等待自己的子進(jìn)程wait無(wú)法等待非當(dāng)前 shell 啟動(dòng)的進(jìn)程這與作業(yè)表的管理范圍一致。在 linux-command 項(xiàng)目中查閱與擴(kuò)展本文內(nèi)容以倉(cāng)庫(kù)中的 command/wait.md 為骨架整理。該倉(cāng)庫(kù)在 command 目錄下收錄了 600 多個(gè) Linux 命令的 Markdown 手冊(cè)文檔詳見(jiàn) README.md并且可通過(guò)npm install linux-command安裝 npm 包以編程方式讀取任意命令的 Markdown 文本如require(linux-command/command/wait.md)與命令索引數(shù)據(jù)可通過(guò)倉(cāng)庫(kù)的 Web 版本在線搜索wait、jobs、bg等命令網(wǎng)頁(yè)內(nèi)容由這些 Markdown 文檔構(gòu)建生成每個(gè)命令文檔都采用統(tǒng)一的概要—主要用途—選項(xiàng)—參數(shù)—例子—注意結(jié)構(gòu)便于對(duì)照查閱。與wait關(guān)系最緊密的擴(kuò)展閱讀文檔均在本倉(cāng)庫(kù)command目錄下command/jobs.md查看作業(yè)狀態(tài)、command/bg.md后臺(tái)恢復(fù)、command/fg.md前臺(tái)切換、command/disown.md移除作業(yè)、command/suspend.md掛起 shell、command/kill.md信號(hào)控制。掌握這一組命令就能在腳本與交互式終端中自如駕馭 Linux 的前后臺(tái)任務(wù)與進(jìn)程生命周期。贊分享文檔教程【免費(fèi)下載鏈接】linux-commandLinux命令大全搜索工具內(nèi)容包含Linux命令手冊(cè)、詳解、學(xué)習(xí)、搜集。https://git.io/linux項(xiàng)目地址https://gitcode.com/GitHub_Trending/linux/linux-command點(diǎn)擊查看免費(fèi)下載相關(guān)推薦fish-shell 內(nèi)置命令 wait 完全指南等待后臺(tái)任務(wù)完成的正確姿勢(shì)fish shell 內(nèi)置命令 wait 完全指南等待后臺(tái)任務(wù)完成的正確姿勢(shì) 導(dǎo)讀 wait 是 fish shell 內(nèi)置的作業(yè)控制命令用于等待一個(gè)或CLI開(kāi)發(fā)工具linux-command 項(xiàng)目詳解bash 內(nèi)建命令 fc —— 歷史命令的查看、編輯與替換執(zhí)行l(wèi)inux command 項(xiàng)目詳解bash 內(nèi)建命令 fc —— 歷史命令的查看、編輯與替換執(zhí)行 導(dǎo)讀 fc fix command是 bash 提供的文檔教程linux-command 手冊(cè)精讀Bash 內(nèi)建 suspend 命令詳解——掛起與恢復(fù) Shell 執(zhí)行l(wèi)inux command 手冊(cè)精讀Bash 內(nèi)建 suspend 命令詳解——掛起與恢復(fù) Shell 執(zhí)行 本篇技術(shù)指南以 linux command 倉(cāng)庫(kù)文檔教程上一篇Windows性能革命AtlasOS四大驅(qū)動(dòng)優(yōu)化工具智能調(diào)度解決方案下一篇終極Kronos金融預(yù)測(cè)模型5分鐘構(gòu)建專業(yè)量化策略的完整指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考