Мониторинг файла журнала до его завершения - PullRequest
0 голосов
/ 26 февраля 2020

Я учусь в старшей школе и пытаюсь написать сценарий в bash, который будет отправлять задания, используя команду "qsub" на суперкомпьютере, использующем другое количество ядер. Затем этот сценарий получит данные о количестве ядер и времени, которое потребовалось суперкомпьютеру для завершения моделирования из каждого сгенерированного файла журнала, называемого «log.lammps», и сохранит эти данные в отдельном файле.

Поскольку для полного генерирования каждого файла журнала требуется разное время, я выполнил шаги из https://superuser.com/questions/270529/monitoring-a-file-until-a-string-is-found, чтобы мой сценарий продолжался, когда последняя строка файла журнала с строка "Общее время стены:" была сгенерирована.

В настоящее время я использую следующий код в al oop, чтобы его можно было запускать для всего указанного числа ядер:

( tail -f -n0 log.lammps & ) | grep -q "Total wall time:"

Однако запуск сценария с этим фрагментом кода привел к усечению файла log.lammps, и сценарий не завершился, даже когда файл log.lammps был полностью создан.

Есть ли какой-либо другой способ для моего сценария продолжить только после завершения отправленного задания?

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Один из способов сделать это - прикоснуться к файлу маркера после завершения и дождаться этого:

#start process:
rm -f finished.txt;
( sleep 3 ; echo "scriptdone" > log.lammps ; true ) && touch finished.txt &

# wait for the above to complete
while [ ! -e finished.txt ]; do
   sleep 1;
done

echo safe to process log.lammps now...

Вы также можете использовать inotifywait или flock, если хотите Избегайте занятого ожидания.

РЕДАКТИРОВАТЬ:

для обработки случая, когда одна из первых команд может потерпеть неудачу, сгруппировать первые команды, а затем добавить true в конец так, чтобы группа всегда возвращала правда, а затем сделал && touch finished.txt. Таким образом, файл Finish.txt изменяется, даже если одна из первых команд завершилась неудачно, а значение l oop ниже не будет ждать вечно.

0 голосов
/ 26 февраля 2020

Я склонен делать такие вещи с: http://stromberg.dnsalias.org/~strombrg/notify-when-up2.html и http://stromberg.dnsalias.org/svn/age/trunk/

Так что-то вроде:

notify-when-up2 --greater-than-or-equal-to 0 'age /etc/passwd' 10

Это не ищет указанный шаблон c в вашем файле - он ищет, когда файл перестает изменяться в течение 10 секунд. Вы можете найти шаблон, заменив возраст на grep:

notify-when-up2 --true-command 'grep root /etc/passwd'

notify-when-up2 может выполнять такие действия, как отправка электронной почты, всплывающее окно или просмотр страницы при изменении состояния. В некоторых случаях это не очень хороший подход по сравнению с использованием ожидания или чего-то еще, но я использую несколько раз в день.

HTH.

0 голосов
/ 26 февраля 2020

Попробуйте следующий подход

# run tail -f in background
(tail -f -n0 log.lammps | grep -q "Total wall time:")  > out 2>&1 &

# process id of tail command
tailpid=$!

# wait for some time or till the out file hqave data
sleep 10

# now kill the tail process
kill $tailpid
...