網(wǎng)站首頁 編程語言 正文
1. 簡介
bash wait 命令是一個 Shell 命令,它等待后臺運(yùn)行的進(jìn)程完成并返回退出狀態(tài)。與等待指定時間的sleep 命令不同,該wait命令等待所有或特定后臺任務(wù)完成。
2. 語法
在 bash 腳本中使用wait命令有不同的方法。下表解釋了每個用例。
命令 | 解釋 |
---|---|
wait | 如果沒有任何參數(shù),該wait命令會等待所有后臺進(jìn)程完成,然后再繼續(xù)執(zhí)行腳本。 |
wait | 添加的 PID 或作業(yè) ID 會等待特定進(jìn)程結(jié)束,然后再繼續(xù)執(zhí)行腳本。 |
wait -n | 僅等待以下后臺進(jìn)程完成并返回退出狀態(tài)。 |
wait -f | 終止程序首先等待后臺任務(wù)完成后再退出。 |
3. 示例
3.1 等待命令
在 bash 腳本中使用wait時需要了解三個附加參數(shù):
1.&
命令后的和號 ( )
表示后臺作業(yè)。
2.$!
獲取最后一個后臺進(jìn)程的PID。使用多個后臺進(jìn)程時,將先前的 PID 存儲在一個變量中。
3.$?
打印上一個進(jìn)程的退出狀態(tài)。
要查看這三個參數(shù)如何協(xié)同工作,請打開終端窗口并運(yùn)行:
sleep 10 & echo $! echo $?
該$!
參數(shù)存儲后臺進(jìn)程PID,同時$?
存儲退出狀態(tài)。退出狀態(tài)0表示命令成功完成。
3.2 單進(jìn)程等待
首先打開終端并創(chuàng)建一個簡單的后臺進(jìn)程:
sleep 10 &
確認(rèn)作業(yè)在后臺運(yùn)行:
jobs -l
使用wait不帶任何參數(shù)的命令暫停直到進(jìn)程完成:
wait
10 秒后(由于sleep 10),控制臺打印完成消息。
3.3 單進(jìn)程 bash 等待
使用該wait命令指示后臺進(jìn)程必須在腳本內(nèi)執(zhí)行的時間點(diǎn)。
例如,在文本編輯器中添加以下代碼:
#!/bin/bash echo Background process & echo First message echo Second message wait echo Third message
如果后臺進(jìn)程沒有完成第一個和第二個進(jìn)程,則該wait命令調(diào)用暫停以等待第二個進(jìn)程之后后臺進(jìn)程完成,然后再繼續(xù)執(zhí)行第三個進(jìn)程。
將腳本另存為single_process.sh
。在終端中,更改權(quán)限以使腳本可執(zhí)行:
sudo chmod +x single_process.sh
運(yùn)行腳本:
./single_process.sh
后臺進(jìn)程在命令之前的任何時間完成wait
,并且腳本繼續(xù)。
3.4 多個進(jìn)程等待
1.打開文本編輯器,添加以下多進(jìn)程腳本:
#!/bin/bash sleep 10 & sleep 15 & sleep 5 & echo $(date +%T) wait echo $(date +%T)
wait該腳本在命令之前和之后打印當(dāng)前時間。沒有任何參數(shù),程序會等待所有進(jìn)程完成。
將腳本另存為test.sh并關(guān)閉文件。接下來,使腳本可執(zhí)行:
sudo chmod +x test.sh
最后,運(yùn)行程序:
./test.sh
由于進(jìn)程在后臺運(yùn)行,所有三個進(jìn)程都在十五秒內(nèi)完成。
使用相同的腳本測試以下用例:
- 將
-n
參數(shù)添加到<strong>wait</strong>
. 只有最快的過程完成,腳本在十秒后結(jié)束。 - 添加作業(yè) ID 以指示腳本應(yīng)等待哪個作業(yè)。例如,
wait %1
暫停以等待進(jìn)程 1 ( sleep 10) 完成。
3.5 多個進(jìn)程 bash 等待 PID
與多個進(jìn)程一起工作時,使用 PID
來標(biāo)識一個進(jìn)程。下面的示例腳本顯示了一個用例:
#!/bin/bash echo "Process 1 lasts for 2s" && sleep 2 & PID=$! echo "Process 2 lasts for 3s" && sleep 3 & echo "Current time $(date +%T)" wait $PID echo "Process 1 ended at time $(date +%T) with exit status $?" wait $! echo "Process 2 ended at time $(date +%T) with exit status $?"
將腳本另存為multi_wait.sh。使腳本可執(zhí)行:
sudo chmod +x multi_wait.sh
運(yùn)行腳本查看輸出:
./multi_wait.sh
該腳本需要兩秒鐘來完成第一個過程(由于sleep2)和三秒鐘來完成第二個過程。這兩個過程同時執(zhí)行,都在三秒內(nèi)完成。
參考:
Bash wait Command with Examples
原文鏈接:https://blog.csdn.net/xixihahalelehehe/article/details/127348688
相關(guān)推薦
- 2022-05-17 Error running ‘myToncat‘: Address localhost:8080 i
- 2022-07-12 Python根據(jù)交集、并集對比兩個文件
- 2022-09-12 Python詳解復(fù)雜CSV文件處理方法_python
- 2022-08-13 Redis - 時間序列數(shù)據(jù)類型的保存方案和消息隊列實現(xiàn)
- 2022-10-03 Docker容器/bin/bash?start.sh無法找到not?found問題解決_docker
- 2022-04-17 Python?如何引入同級包和模塊_python
- 2023-06-03 C++一個函數(shù)如何調(diào)用其他.cpp文件中的函數(shù)_C 語言
- 2022-04-03 Go語言讀取txt文檔的操作方法_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支