溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux bash wait命令具體使用方法是什么

發(fā)布時間:2022-01-27 15:28:19 來源:億速云 閱讀:326 作者:柒染 欄目:開發(fā)技術(shù)

Linux bash wait命令具體使用方法是什么,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

wait命令可以使當(dāng)前shell進程掛起,等待所指定的由當(dāng)前shell產(chǎn)生的子進程退出后,wait命令才返回。wait命令的參數(shù)可以是進程ID或是job。

Bash wait命令

wait內(nèi)置的一般語法采用以下形式:

 wait [options] ID

Copy

ID是進程或任務(wù)ID。 如果沒有指定ID,則命令等待所有后臺任務(wù)直到完成。

wait命令返回wait的最后一個命令的退出狀態(tài)。

例如,要wait PID 7654的后臺進程,您將使用:

 wait 7654

Copy

當(dāng)給出多個進程時,命令等待所有進程完成。

使用jobspec指定作業(yè),這是一種引用構(gòu)成作業(yè)的進程的方法。 Jobspec以百分比符號開始,后跟作業(yè)編號(%n)。 這是一個在后臺運的ded例子:

 rsync -a /home /tmp/home &

Copy

shell作業(yè)ID(括號括起來)和進程ID將顯示在終端上:

 [2] 54377

Copy

等待作業(yè),運行wait命令后跟Jobspec:

 wait %2

Copy

在使用-n選項中調(diào)用時,命令僅在指定的PID或Jobspecs中僅等待單個作業(yè)完成并返回其退出狀態(tài)。 如果沒有提供參數(shù),wait -n等待任何后臺作業(yè)完成并返回作業(yè)退出狀態(tài)。

 wait -n 45432 54346 76573

Copy

在上面的示例中,wait -n僅打印首先退出的作業(yè)的返回狀態(tài); 它沒有顯示進程的PID。 如果要獲取返回退出狀態(tài)的進程PID或Jobspec,請使用-p選項將其分配給變量:

 wait -p job_id -n 45432 54346 76573

Copy

-p選項在BASH 5.1中引入。 如果使用較舊的BASH版本,您將獲得“invalid option”錯誤。

-f選項告訴wait等待每個PID或JOBSPEC在返回其退出代碼之前終止,而不是在更改作業(yè)狀態(tài)時返回。 啟用作業(yè)控件時,此選項僅有效。 默認情況下,僅為交互式提示啟用作業(yè)控件。

例子

wait通常用于shell腳本生成并行執(zhí)行的子進程。

為了說明命令如何工作,創(chuàng)建以下腳本:

 #!/bin/bash
 sleep 30 &
 process_id=$!
 echo "PID: $process_id"
 wait $process_id
 echo "Exit status: $?"

Copy

讓我們按行解釋代碼行:

  • 第一行稱為shebang,它告訴操作系統(tǒng)使用哪個解釋器來解析文件的其余部分。

  • 使用sleep命令來模擬一個耗時的后臺進程。

  • $!是Bash內(nèi)部變量,用于在后臺存儲上一次運行的進程的PID。 在此示例中,這是sleep命令的PID。 我們將PID存儲在變量(process_id)中。

  • 打印PID號。

  • PID傳遞給wait命令,該命令等待直到睡眠命令完成。

打印wait命令的退出狀態(tài)。 $?是內(nèi)部Bash變量,用于保存最后執(zhí)行的命令的退出狀態(tài)。

如果您運行腳本,它將打印這樣的內(nèi)容:

 PID: 36353
 Exit status: 0

Copy

這里使用-n選項的示例:

 #!/bin/bash
 sleep 3 &
 sleep 30 &
 sleep 5 &
 wait -n
 echo "First job completed."
 wait
 echo "All jobs completed."

Copy

執(zhí)行腳本時,它會產(chǎn)生3個后臺進程。 wait -n等待直到完成第一個作業(yè)并打印echo語句。 wait等待所有后臺任務(wù)完成。

 first job completed
 all jobs completed

Copy

最后一個示例說明-f選項。 打開終端并運行:

 sleep 3600 &

Copy

 [1] 46671

Copy

等待這個進程:

 wait 46671

Copy

打開另一個終端并使用kill命令停止進程:

 kill -STOP 46671

Copy

一旦改變了進程狀態(tài),wait命令將完成并返回進程退出代碼。

現(xiàn)在,重復(fù)相同的步驟,但這一次使用wait -f $pid:

 sleep 3600 &
 wait -f 46671

Copy

停止另一個終端的進程:

 kill -STOP 46671

Copy

這次wait命令將無法完成。 它將在sleep進程終止之前運行。

看完上述內(nèi)容,你們掌握Linux bash wait命令具體使用方法是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI