Тайм-аут сценария bash, если на некоторое время нет вывода - PullRequest
0 голосов
/ 18 марта 2020

У меня есть a.sh, который вызывает b.sh:

. "b.sh" 2>&1 | tee -a "log.txt" &
wait $!

xxx

, как я могу написать условие, которое обнаруживает, что b.sh не выводит log.txt в течение определенного времени, а затем выполняется через wait $!

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Вы можете сделать:

#!/bin/bash


./"b.sh" 2>&1 | { while read -t 3 line; do
    echo "$line" >> log.txt
done; pkill -g 0; } &

wait $!

Обратите внимание, что в вашем примере ваш скрипт не вызывает b. sh, но использует его. Это решение вызывает b. sh. Это кажется более чистым, поскольку чтение выходных данных сценария является действительно странным поведением.

Но учтите, что если b.sh вызывает какую-то долго работающую программу, которая генерирует большой объем вывода, но делает это медленно, вы будете несомненно, столкнуться с проблемами буферизации. Долгосрочная программа, скорее всего, будет блокировать буферизацию своих выходных данных, поэтому, хотя она периодически генерирует данные во свои внутренние буферы, read в то время как l oop не увидит ее и может преждевременно отключиться.

0 голосов
/ 18 марта 2020
. "b.sh" 2>&1 | tee -a "log.txt" &
child=$!
# loop while child process exists
while kill -0 "$child" 2>/dev/null; then

     # get first length
     if [[ -z "$len1" ]]; then
          len1=$(wc log.txt)
     fi

     # sleep for a certain time
     sleep 1

     # get length of file after 1 second
     len2=$(wc log.txt)

     # compare lengths
     if [ "$len1" == "$len2" ]; then
         echo "Och my! File log.txt did not change in 1 second"
         break
     else
         echo "All good! File log.txt did change in 1 second"
     fi

     # len1 becomes len2
     len1=$len2;
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...