Как сохранить вывод сообщения об ошибке psql в переменной bash?

intr должен позволить вам снова получить управление, когда вы нажмете ^C, но обычно не сразу.

 intr Если файловая операция NFS имеет основной таймаут, и она жестко смонтирована, то разрешите сигналам прерывать
 файловую операцию и заставить ее вернуть EINTR вызывающей программе. По умолчанию не разрешается
 прерывать файловые операции.

Как вы говорите, проблема здесь в ожиданиях. Проблемы с сетью могут быть временными, но сбой операции - это навсегда. Поэтому большинство операций по умолчанию просто блокируются до завершения операции.

Это стандартный ответ, но, посмотрев текущую страницу man, я вижу следующее:

 Опция монтирования intr / nointr устарела после версии ker-...
 nel 2.6.25. Только SIGKILL может прервать текущую операцию NFS
 на этих ядрах, и если она указана, эта опция монтирования
 опция игнорируется, чтобы обеспечить обратную совместимость
 со старыми ядрами.

Таким образом, мне кажется, что это не проблема NFS3/NFS4, а решение о том, как работает intr. Поэтому вы должны быть в состоянии KILL процесс, но это может не дать вам много пользы.

Я не смог найти обсуждение того, почему эта опция была удалена. Можете ли вы убить -KILL

свой процесс?
4
11.06.2017, 02:49
2 ответа

Напрямую нельзя. По крайней мере, не смешивая его со стандартным выводом или отказываясь от него. Однако есть способ!

#!/bin/bash
errorlog=$(mktemp)
trap 'rm -f "$errorlog"' EXIT
pwcheck="$(psql -q -U postgres -h $ip -d $database 2> "$errorlog")"
if [[ 0 -ne $? ]]; then
    echo "Something went wrong; error log follows:"
    cat "$errorlog"
fi
6
27.01.2020, 20:52

Это захватывает stdout и stderr, но скрывает код выхода.

$ output=$(psql -c "select xow()" 2>&1 | cat)
$ echo $?
0
$ echo "$output"
ERROR:  function xow() does not exist
LINE 1: select xow()
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
$ 

Это включает в себя код выхода в захваченном выводе.

$ output=$({ psql -c "select xow()" 2>&1; echo rc=$?; } | cat)
$ echo $?
0
$ echo "$output"
ERROR:  function xow() does not exist
LINE 1: select xow()
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
rc=1
$ 

Это возвращает код выхода, отличный от -нулевого, если команда psql завершается неудачно. ПРИМЕЧАНИЕ :Это код выхода из grep, а не из psql. В этом случае значения совпадают, но это просто совпадение.

$ output=$( output=$({ psql -c "select xow()" 2>&1; echo rc=$?; } | cat); echo "$output" | grep 'rc=0'; rc2=$?; echo "$output"; exit $rc2 )
$ echo $?
1
$ echo "$output"
ERROR:  function xow() does not exist
LINE 1: select xow()
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
rc=1
$

Вот то же самое, возвращающее нулевой выход для успешной команды psql. ПРИМЕЧАНИЕ. :"rc=0" появляется дважды в выводе.

$ output=$( output=$({ psql -c "select now()" 2>&1; echo rc=$?; } | cat); echo "$output" | grep 'rc=0'; rc2=$?; echo "$output"; exit $rc2 )
$ echo $?
0
$ echo "$output"
rc=0
              now              
-------------------------------
 2020-05-13 11:06:50.465941-04
(1 row)

rc=0
$ 
0
13.05.2020, 14:30

Теги

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