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