Тайм-аут в сценарии оболочки и сообщить эти входные данные с тайм-аутом - PullRequest
0 голосов
/ 20 марта 2019

Я бы хотел провести анализ с использованием программы Arlsumstat_64bit с тысячами входных файлов.

Arlsumstat_64bit читает входные файлы (.arp) и записывает файл результатов (sumstat.out). Каждый ввод будет добавлять новую строку в файл результатов (sumstat.out) на основе аргумента "0 1"
Поэтому я написал сценарий оболочки для выполнения всех входных данных (* .arp) в одной папке. Однако, если входные файлы содержат ошибку, сценарий оболочки будет зависать без какой-либо последующей обработки. Поэтому я нашел команду с «тайм-аутом» для решения моей проблемы. Я сделал сценарий оболочки следующим образом

#!/bin/bash

for sp in $(ls *.arp) ; 
do

echo "process start: $sp"


timeout 10 arlsumstat_64bit ${sp}.arp sumstat.out 1 0 

        rm -r ${sp}.res

        echo "process done: $sp"


done

Однако мне все еще нужно знать, какие входные файлы не удалось. Как можно составить список, сообщающий мне, какие входные файлы имеют «тайм-аут»?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

См. Справочную страницу для команды 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
0 голосов
/ 20 марта 2019

Ниже код должен работать для вас:

  #!/bin/bash
  for sp in $(ls *.arp) ; 
  do
  echo "process start: $sp"
  timeout 10 arlsumstat_64bit ${sp}.arp sumstat.out 1 0 
  if [ $? -eq 0 ]
  then
    echo "process done sucessfully: $sp"
  else
    echo "process failed: $sp"
  fi
  echo "Deleting ${sp}.res"
  rm -r ${sp}.res
  done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...