Задать вопрос
@victor1234
IT: Компьютерное зрение, linux, с++

Как правильно следить за последовательным ходом выполнения работ консольных утилит?

Есть данные, которые я обрабатываю последовательно консольными утилитами (написанными мной). Соответственно они принимают на вход данные в виде файлов и выдают так же файлы, которые обрабатываются дальше. Задача ресурсоемкая и занимает время.
Как правильно следить за ходом выполнения работы и поддерживать запуск с предыдущего удачно выполненного этапа, в случае некорректно завершения текущего?
Сейчас я просто смотрю наличие файлов на выходе. Если есть, значит этот этап завершен удачно и можно его пропустить. Но может есть какая-то отработанная методика для таких задач? Система Linux (Ubuntu).
  • Вопрос задан
  • 452 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
xotkot
@xotkot
хорошо есть и хорошо весьма
простенький вариант с добавлением функции status:
#!/usr/bin/bash
set -o history

status(){
  STATUS=$?; COMMAND=$(history 2 |head -n1 |awk '{$1="";print}')
  if [[ $STATUS == 0 ]]
    then  echo -e "[   OK  ]\t$COMMAND"
    else  echo -e "[ ERROR ]\t$COMMAND"
            exit # при ошибке останавливаем обработку скрипта
  fi
}

touch a1.txt
status

rm a1.txt
status

rm a1.txt
status


вывод в консоль получим:
[   OK  ]	 touch a1.txt
[   OK  ]	 rm a1.txt
rm: невозможно удалить 'a1.txt': Нет такого файла или каталога
[ ERROR ]	 rm a1.txt


при желании всё это можно логировать в файл
Ответ написан
Комментировать
@abcd0x00

Как правильно следить за ходом выполнения работы и поддерживать запуск с предыдущего удачно выполненного этапа, в случае некорректно завершения текущего?

У тебя прямо в скриптах должно быть завершение с кодом. Если ошибок не было, нужно завершать скрипт через exit 0. Если произошла ошибка, нужно завершать скрипт через exit 1.
Когда у тебя скрипты так сделаны, ты можешь проверять их код завершения.

А потом ты можешь написать скрипт со строками
{ script1.sh && echo "script1 - ok"; } || echo "script1 - fail"
{ script2.sh && echo "script2 - ok"; } || echo "script2 - fail"
{ script3.sh && echo "script3 - ok"; } || echo "script3 - fail"


Пример
{ echo x1 && echo "script1 - ok"; } || echo "script1 - fail"
{ cat x && echo "script2 - ok"; } || echo "script2 - fail"
{ echo x2 && echo "script3 - ok"; } || echo "script3 - fail"
{ touch /x && echo "script4 - ok"; } || echo "script4 - fail"


[guest@localhost ~]$ { echo x1 && echo "script1 - ok"; } || echo "script1 - fail"
x1
script1 - ok
[guest@localhost ~]$ { cat x && echo "script2 - ok"; } || echo "script2 - fail"
cat: x: Нет такого файла или каталога
script2 - fail
[guest@localhost ~]$ { echo x2 && echo "script3 - ok"; } || echo "script3 - fail"
x2
script3 - ok
[guest@localhost ~]$ { touch /x && echo "script4 - ok"; } || echo "script4 - fail"
touch: невозможно выполнить touch для «/x»: Отказано в доступе
script4 - fail
[guest@localhost ~]$



Можно сделать и так
{ script1.sh && echo "script1 - ok"; } || { echo "script1 - fail"; exit 1; }
{ script2.sh && echo "script2 - ok"; } || { echo "script2 - fail"; exit 1; }

Тогда он в случае успеха будет выводить успешную фразу и продолжать, а в случае ошибки он будет выводить сбойную фразу и сразу выходить (с кодом ошибки).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы