Я понял!
Мы можем передать поток через временный файл! В Linux мы можем передать его через файл в / dev / shm
, чтобы данные оставались в памяти. Мы также можем заключить его в функцию:
get_output() {
$1 > /dev/shm/bash_pipe
eval $2=`cat /dev/shm/bash_pipe`
rm /dev/shm/bash_pipe
}
Затем мы можем использовать его так: get_output fct var
, и вы можете использовать вывод fct
с $ var
.
Кажется, ответ уже был дан в другом месте, но вот что вы можете сделать.
Это команда, которая возвращает количество секунд, в течение которых выполнялась эта команда (добавленное значение s во времени возвращает только секунды).
ps -p "<process-id>" -o times=
Вам также может понадобиться
pgrep <name-of-the-script>
Или вообще
ps -p "$(<name-of-the-script>)" -o times=
, чтобы получить идентификатор процесса.
Затем вы присваиваете результат переменной и проверяете ее так часто, как хотите.
Вам нужна обертка.
Самый очевидный из них — переименовать исходный скрипт и на его месте создать скрипт-оболочку, который бы вызывал оригинал с тайм-аутом. Вариантом этого является создание ссылки с другим именем на сам скрипт, и способ вызова скрипта будет определять, что в нем происходит. Это должно быть ясно через мгновение.
Если ваш скрипт вызывается без параметров, вы можете добавить эту внутреннюю оболочку в свой скрипт. Он снова вызовет себя с timeout
и с переключателем в параметре $1
.
#!/usr/bin/env bash
TIMEOUT=10
WRAPPER=FALSE
if [ "$1" != FALSE ]; then
timeout "$TIMEOUT" "$0" "$WRAPPER"
exit
fi
#the proper script
echo Here\'s the original script starting.
sleep 11
echo End of the original script.
Итак, возвращаясь к предыдущему решению, вы можете использовать $0
, чтобы увидеть, как был вызван скрипт. Это был файл или ссылка на него?
Если вы не хотите или не можете создать новый исполняемый файл/ссылку, а исходный вызов использует параметры, доступны другие переключатели. Например, может использоваться временный файл. Это будет связано с некоторыми крайними случаями, которые требуют очистки этого файла на случай, если что-то пойдет не так. Вы также можете использовать PPID в качестве переключателя. Если родительская команда такая же, как и дочерняя, то она выполняет собственно скрипт, в противном случае она выполняется сама с тайм-аутом.