當(dāng)我通過 cron 運(yùn)行以下 bash 腳本時(shí),最后一行在前一行完成之前運(yùn)行。為什么?我怎樣才能執(zhí)行我想要的命令?我確信這cron是罪魁禍?zhǔn)?,但為了爭論,這里有一個(gè)虛擬的bash 腳本 (顯然,這只是一個(gè)例子。在現(xiàn)實(shí)世界中,我正在 python 程序中做一些工作,然后嘗試完成后將其工作產(chǎn)品復(fù)制到另一個(gè)地方。):#!/usr/bin/env bashcd /tmp/kier/scriptscript output -c "./sleeper.py; echo '...and we are done'"echo "This is the next line after invoking script..."...為了完整起見,這里是python 腳本,sleeper.py:#!/usr/bin/env python3import timeprint("python program starting")time.sleep(5)print("python program done")當(dāng)我從命令行運(yùn)行 bash 腳本時(shí),一切都很好。具體來說,“This is the next line...”文本在 5 秒睡眠后的最后打印。但是當(dāng)我從 cron 運(yùn)行它時(shí),輸出順序錯(cuò)誤(這是 cron 運(yùn)行作業(yè)后發(fā)給我的電子郵件):Script started, file is outputScript done, file is outputThis is the next line after invoking script...python program startingpython program done...and we are doneScript started, file is output所以你可以看到“這是下一行......”在 python 腳本真正啟動(dòng)之前打印出來。就好像它在后臺(tái)運(yùn)行 python 腳本一樣。我很難過。為什么會(huì)發(fā)生這種情況,如何讓echo命令等到scriptpython 程序運(yùn)行完畢?(最后,是的,我可以在發(fā)送到的命令中包含我的額外命令script,我實(shí)際上正在考慮這一點(diǎn)。但是來吧!這太瘋狂了!)
1 回答

小怪獸愛吃肉
TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
我應(yīng)該跟進(jìn)并分享我想出的解決方案。最后,我從來沒有很好地回答為什么它在我的(RedHat)環(huán)境中以這種方式表現(xiàn),所以我決定采用一種解決方法。我...
在調(diào)用“腳本”之前創(chuàng)建了一個(gè)哨兵文件,
在腳本的命令文本中包含一個(gè)額外的命令,用于刪除哨兵文件,然后
在繼續(xù)之前等待哨兵文件消失。
像這樣:
sentinel=`mktemp`
script output -c "./sleeper.py; rm $sentinel"
while [ -f $sentinel ]
do
sleep 3
done
是的,這是一個(gè) hack,但我需要繼續(xù)前進(jìn)。
添加回答
舉報(bào)
0/150
提交
取消