После принципа KISS я просто контролировал бы свободную память с free -m
попытка выполнить тот же набор пользовательских приложений в течение того же промежутка времени. Просто имейте в виду, это 'кэшировалось', на самом деле свободная память также, таким образом, Вам нужна 2-я строка, которая показывает, каковы реальные объемы используемой и свободной памяти.
Относительно ЦП — WMs обычно не делают пожирателя ресурсов ЦП собой — они делают ту реакцию на действия некоторого пользователя, таким образом, можно сравнить создания/удаления большого количества окон, переместив их и так далее.
С ksh/bash/zsh:
{
(./slowprocess.sh >&3 3>&-; echo "$?") |
if read -t 3 status; then
echo "Cool it completed with status $status, do stuff..."
else
echo "It didn't complete, do something else..."
fi
} 3>&1
Мы копируем исходный stdout на fd 3 (3>&1
) таким образом, мы можем восстановить его для slowprocess.sh
(>&3
), в то время как stdout для остальной части (...)
подоболочка переходит к каналу к read -t 3
.
С другой стороны, если Вы хотите использовать timeout
(сюда принятие GNU timeout
):
timeout --foreground 3 sh -c './slowprocess.sh;exit'
избежал бы slowprocess.sh
быть уничтоженным ( ;exit
необходимо для sh
реализации, которые оптимизируют путем выполнения последней команды в процессе оболочки).
Вот решение с помощью только повсеместные инструменты оболочки.
Это должно быть легко сделано путем разветвления медленного процесса и a sleep
в фоновом режиме и ожидание первого для окончания, за исключением того, что wait
встроенная оболочка ожидает всех заданий для окончания, а не только первого.
Таким образом вместо этого, разветвите медленный процесс и a sleep
в фоновом режиме имейте их обоих, сообщает их состояние через канал и читает первое состояние, которое выходит из канала.
fifo=$(mktemp -u) # if not on Linux, adapt to what your OS provides
mkfifo -m 600 "$fifo"
{ ./slowprocess.sh; echo z >"$fifo"; } &
sh -c 'sleep 3; echo a' >"$fifo" &
sleep_pgid=$!
read status <$fifo
case $status in
a) echo "That process is taking a long time"; read ignored <$fifo;;
z) echo "Done already"; kill -INT -$sleep_pgid;;
esac
rm "$fifo"
mktemp
вызов не является портативным (не будет работать над BSDs, например, где необходимо указать шаблон),
– Stéphane Chazelas
31.07.2013, 09:00
set -m
.
– Stéphane Chazelas
31.07.2013, 09:00
bash
, Вам нужны кавычки вокруг переменных в перенаправленных файлах также (> "$fifo"
)
– Stéphane Chazelas
31.07.2013, 09:01
umask
кому: 077
избегать кого-то вмешивающегося в Ваш FIFO.
– Stéphane Chazelas
31.07.2013, 09:07
/dev/null
.
– Stéphane Chazelas
31.07.2013, 09:11
Независимо от того, что блокируется в slowprocess.sh
мог быть фон так, чтобы он мог продолжиться даже после тайм-аута.
Также Вы смогли использовать a signal
от timeout
назад к Вашему main.sh
. См. страницу справочника для timeout
.
выборка от timeout
информационная страница
`-s SIGNAL'
`--signal=SIGNAL'
Send this SIGNAL to COMMAND on timeout, rather than the default
`TERM' signal. SIGNAL may be a name like `HUP' or a number. Also
see *Note Signal specifications::.
Необходимо было бы захватить для этого сигнала в main.sh
.
Также timeout
возвращает различные состояния для различных типов отказов. Вы смогли использовать их также:
Exit status:
124 if COMMAND times out
125 if `timeout' itself fails
126 if COMMAND is found but cannot be invoked
127 if COMMAND cannot be found
the exit status of COMMAND otherwise
Они присутствуют в переменной $?
, после timeout ...
выполнения строки.
timeout
не будет видеть, работает ли это все еще. Если timeout
не уничтожает процесс, затем он не возвращается.
– Gilles 'SO- stop being evil'
31.07.2013, 02:21