См. Справочную страницу для команды timeout
http://man7.org/linux/man-pages/man1/timeout.1.html
Если время команды истекло, а параметр --preserve-status не задан, закройте
со статусом 124. В противном случае выйдите со статусом КОМАНДА. Если нет
сигнал указан, отправьте сигнал TERM по истечении времени ожидания. Семестр
Сигнал убивает любой процесс, который не блокирует и не перехватывает этот сигнал.
Возможно, потребуется использовать сигнал KILL (9), так как этот сигнал
не может быть пойман, и в этом случае статус выхода 128 + 9, а не
124.
Вы должны узнать, какие коды выхода возможны для программы arlsumstat_64bit
. Я предполагаю, что он должен выйти со статусом 0 в случае успеха. В противном случае приведенный ниже скрипт не будет работать. Если вам необходимо различать время ожидания и другие ошибки, он не должен использовать состояние выхода 124
или тот, который используется timeout
для указания времени ожидания. Таким образом, вы можете проверить состояние выхода вашей команды, чтобы различать успех, ошибку или тайм-аут при необходимости.
Чтобы сохранить простоту сценария, я предполагаю, что вам не нужно дистанцироваться между таймаутом и другими ошибками.
Я добавил несколько комментариев, где я изменил ваш скрипт, чтобы улучшить его или показать альтернативы.
#!/bin/bash
# don't parse the output of ls
for sp in *.arp
do
echo "process start: $sp"
# instead of using "if timeout 10 arlsumstat_64bit ..." you could also run
# timeout 10 arlsumstat_64bit... and check the value of `$?` afterwards,
# e.g. if you want to distinguish between error and timeout.
# $sp will already contain .arp so ${sp}.arp is wrong
# use quotes in case a file name contains spaces
if timeout 10 arlsumstat_64bit "${sp}" sumstat.out 1 0
then
echo "process done: $sp"
else
echo "processing failed or timeout: $sp"
fi
# If the result for foo.arp is foo.res, the .arp must be removed
# If it is foo.arp.res, rm -r "${sp}.res" would be correct
# use quotes
rm -r "${sp%.arp}.res"
done