Существует ли простой способ узнать последнюю строку, выполняемую в сценарии удара?

"Не удалить / домой" (который является @home).

Почему Вы хотели бы удалить подобъем, на котором находится Ваша учетная запись/home/, если Вы не создали снимок/home_snapshot_yymmdd для замены / домой?

Я плохо знаком с использованием btrfs, но это - то, что я узнал: / и @home (/и / домой) создаются btrfs, когда он установлен на Вашем HD как файловая система. Если Вы не делаете восстановление / домой от предыдущего снимка, насколько я понимаю, Вы отключили бы себя в коленях.

Однако можно смонтировать устройство, что / домой идет, КОРЕНЬ AS, использование монтируют/dev/sa/mnt/(или что когда-либо устройство работа btrfs система) Затем CD к/mnt/, и оттуда дайте удалить команду для @home. Затем можно использовать команду mv для перемещения @home_snapshot_yymmdd (или что когда-либо Вы назвали им) к @home. Перемещение может занять часы, в зависимости от размера @home. Затем CD назад в Вашу собственную учетную запись и проблему sudo umount/mnt/Вы никогда не имеете действительно выхода из системы или закрываете Вашу систему. Это - красота btrfs.

2
14.01.2019, 00:11
3 ответа

Сначала вы должны попытаться определить, в котором Итерация возникает проблема. Если вам повезло, то это всегда одинаково. Если вы не делаете это в любом случае, то вы должны подсчитать итерации и распечатать их или записывать их в файл:

exec 3>/my/logfile
iter=0
while whatevercondition; do
  ((iter++))
  echo "$iter" >&3
done

Если проблема встречается всегда в той же итерации, то вам следует активировать вывод отладки:

CRASH_ITER=12345
iter=0
while whatevercondition; do
  ((iter++))
  if [ "$iter" -eq "$CRASH_ITER" ]; then
    set -vx
  fi
done

Невоспроизводимые ошибки.

Если невозможно сузить ошибку к определенной итерации, то вы можете иметь Bash Написать полную вывод отладки в файл:

bash -vx ./script.sh 2>debug.txt
3
27.01.2020, 22:00

Если вы добавляете его в верхнюю часть вашего сценария Bash:


   function DEBUG_TRAP() { 
      typeset -p BASH_SOURCE; typeset -p BASH_LINENO; typeset -p FUNCNAME
   }
   trap DEBUG_TRAP INT

Вы можете получить информацию о том, где программа, отправив процесс сигнала INT:

Убить -Int Номер процесса

Вы можете получить номер процесса внутри сценария Bash, как это:

   echo $$

, если вы не получаете никакого вывода после этого, то либо ваш скрипт перенаправил свой выход, либо скрипт висел внутри процесса. LSOF расскажет вам информацию о перенаправлении вывода, в то время как PS предоставит информацию о состоянии процесса.

1
27.01.2020, 22:00

Если бы ваш цикл выглядел так:

i=0
while [ "$((i+=1))" -le 5000 ] &&
      set >iter.log
do    monte_carlo
done

Для каждой итерации перезаписывался бы файл, в котором каждый раз перечислялись бы текущие значения всех переменных оболочки. Таким образом, если цикл прерывается при запуске 488, у вас будет файл iter.log, в котором значение $i будет записано как 488, а все остальные переменные оболочки в начале итерации.

Чтобы отследить номер строки, которая не работает, можно пойти немного дальше:

i=0 PS4='$LINENO : '; set -x
while [ ... ] &&
      set >iter.log
do    ...
done 2>>iter.log

Это все равно перезапишет файл для каждой итерации, но также добавит отладочный вывод для каждой выполненной строки и включит номер ее строки в файл.

0
27.01.2020, 22:00

Теги

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