Bash

帶有 while 循環的 Bash 腳本,它等待文件被刷新,但如果超過時間門檻值則終止

  • April 7, 2022

我對 bash 非常了解,所以如果這很明顯可以解決,我深表歉意,如果需要更多詳細資訊,請告訴我。下面的腳本是啟動 python 工作流並等待在工作流結束時更新 results.json 文件的較大腳本的一部分。

我試過用

{
   sleep 1m
   kill $$
}&

但這會在 results.json 文件在 1 分鐘內刷新時生成錯誤:

殺死:(90015) - 沒有這樣的過程

這是腳本:

#! /bin/bash
export DISPLAY=:0.0

export outputfile=results.json

if [[ ! -e $outputfile ]]; then
   touch $outputfile
fi

OldTimestamp=$(date -r $outputfile)

{
   sleep 1m
   kill $$
}&

NewTimestamp=$OldTimestamp; 
while [ "$NewTimestamp" = "$OldTimestamp" ]; do 
  sleep 0.1
  NewTimestamp="$(date -r $outputfile)" 
done

如果你想要做的就是擺脫那個kill: (90015) - 沒有這樣的程序錯誤,你可以在殺死它之前檢查程序是否仍在執行:

{
   sleep 1m
   ps -p $$ > /dev/null && kill $$
}&

但我實際上根本不會使用 kill 。您可以只跟踪您在 while 循環中進行了多少次互動,並在適當次數的迭代後中斷循環:

NewTimestamp=$OldTimestamp; 
iterations=0
while [ "$NewTimestamp" = "$OldTimestamp" ] && [ $iterations -lt 600 ]; do
  sleep 0.1
  NewTimestamp="$(date -r $outputfile)"
  let iterations++
done

如果您想在文件未更新的情況下使用非零退出程式碼退出,您可以在之後添加:

if [ "$NewTimestamp" = "$OldTimestamp" ] ; then 
   echo "results.json was not updated" >&2
   exit 1
fi

或類似的。

引用自:https://unix.stackexchange.com/questions/698250