第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 go 程序中運行時 Bash 腳本掛起

在 go 程序中運行時 Bash 腳本掛起

Go
有只小跳蛙 2023-06-19 17:15:11
我有一個從終端運行時正常執(zhí)行的 bash 腳本 postinstall.sh./postinstall.sh該腳本運行一系列命令,創(chuàng)建目錄、chown、chmod 文件和目錄,在腳本的末尾是echo "Done"exit 0當我在 go 中將其作為 exec.Cmd 運行并調(diào)用 cmd.Wait() 函數(shù)時,它永遠不會返回。所以我修改了我的代碼以使用來自https://github.com/go-cmd/cmd的包,因為我希望能夠記錄我“實時”運行的腳本的輸出,但也可以檢測它們何時完成. 因此,經(jīng)過一系列工作后,我現(xiàn)在可以將 Cmd 的 stdOut 記錄到我的 logLevel STATUS 日志中,并將 Cmd 的 stdErr 記錄到我的 logLevel ERROR。我還可以為命令設(shè)置超時,并實時記錄其進度。這個新進程在一些簡單的情況下按預期工作,但是當我向它扔大 postinstall.sh 腳本時,它一直運行到最后,然后掛起,最終超時。在命令行上手動運行時,該過程需要幾秒鐘,我將超時設(shè)置為 30 秒。日志記錄顯示STATUS- Done就在exit 0go-cmd 包的文檔顯示了一種非鎖定方式來告訴進程已經(jīng)完成,我正在檢查(并處理我的測試用例)我也在檢查 cmd.Status().finished 標志(bool)并且兩者都沒有其中報告該過程已完成。這與我通過使用內(nèi)置 exec.Cmd 中的 cmd.Wait() 函數(shù)看到的結(jié)果相同,直到現(xiàn)在我才能看到腳本一直到最后,但由于某種原因不是正在返回,或者 go 程序無法判斷已經(jīng)返回。該腳本正在做的一些事情是在 /etc/init.d 中啟動或重新啟動服務,如果其中一個在后臺啟動一個進程,因為父進程是安裝后腳本,這可能會導致該進程在圍棋之眼?或可能導致此類行為的任何其他類型的命令?我可能只需要開始刪除部分腳本,看看我是否可以完成它以縮小導致它與我的測試腳本不同的原因,但它大約有 100 行,以及將腳本放入設(shè)備是一個多步驟的過程。testscript 類似于#!/bin/bashecho "stdOut"sleep 1>2& echo "stdErr"sleep 2echo "Finsihed"sleep 1這按預期工作(限制為 1 秒時超時,超時設(shè)置為 4 秒時顯示完成)還應注意該過程適用于其他腳本。這是執(zhí)行 preinstall.sh 的更新過程的一部分,然后使用相同的過程對包含更新的文件調(diào)用 tar -xvf,然后繼續(xù)執(zhí)行此安裝后腳本。所以大多數(shù)時候我的進程成功檢測到進程已經(jīng)退出,這就是安裝后的問題,但我想不出是什么讓它掛起,但從終端運行時退出正常。
查看完整描述

1 回答

?
心有法竹

TA貢獻1866條經(jīng)驗 獲得超5個贊

這是來自Cmd.wait的文檔,重點是:


func (c *Cmd) Wait() error

Wait 等待命令退出并等待任何復制到 stdin 或從 stdout 或 stderr 復制完成。


這意味著它將等待所有進程關(guān)閉相關(guān)管道,而不僅僅是給定進程退出。當您在后臺啟動進程時,這是一個問題:


這是一個例子:


#!/bin/bash

sleep 3600 &

echo "Exit"

sleep繼承 stdin/out/err 并讓它們打開一個小時。它會在終端中立即退出,因為 Bash 不關(guān)心終端打開了什么:


$ ./testscript; echo "Returned"

Exit

Returned

$

但是,如果您通過管道傳輸?shù)絚at,它將等待所有潛在數(shù)據(jù)完成(以防萬一sleep決定稍后再寫一些東西),然后 bash 依次等待cat:


$ ./testscript | cat; echo "Returned"

Exit

(Hangs for an hour)

您可以通過確保任何分叉進程不會通過重定向到其他地方寫入管道來解決此問題:


#!/bin/bash

sleep 3600 < /dev/null > /dev/null 2>&1 &

echo "Exit"

由于sleep不再保持管道打開,它會立即返回,無論是在 shell 中還是在Cmd.Wait():


$ ./testscript | cat; echo "Returned"

Exit

Returned


查看完整回答
反對 回復 2023-06-19
  • 1 回答
  • 0 關(guān)注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號