Как ведет себя заблокированный процесс по SSH, записывающий в стандартный вывод при потере сеанса SSH?

В стиле Борна (например, bash ) , В оболочках, подобных Csh или rc, используйте:

awk -F'|' '$12 == "\\N"'

В строках awk обратная косая черта используется для введения C-подобных escape-последовательностей, таких как \ b для обратного пробела, \ n для новая строка, \ 123 для восьмеричных последовательностей ... Вам понадобится \\ для самой обратной косой черты. \ N в настоящее время не является известной управляющей последовательностью ни в одной известной мне реализации awk .

Некоторые реализации awk будут обрабатывать "\ N" как \ и N , некоторые как N , некоторые (gawk) вроде N с предупреждением. POSIX оставляет поведение неопределенным.

Обратите внимание, что это также относится к строкам, передаваемым как:

awk -F'|' -v value='\\N' '$12 == value'

Или:

awk -F'|' '$12 == value' value='\\N'

Вы можете использовать среду для передачи значения как есть, не беспокоясь об экранировании специальных символов для awk (и позволяет избежать проблем с GNU awk 4.2 или выше, где обрабатывает значения, начинающиеся с @ / и заканчивающиеся на / , особенно ):

VALUE='\N' awk -F'|' '$12 == ENVIRON["VALUE"]'

Это также относится к литералам регулярных выражений, которые выражаются как /.../ , как в:

awk -F'|' '$12 ~ /\\N/'

Однако это еще больше усложняется тем фактом, что обратная косая черта перегружается как вводный элемент escape-последовательности ( для \ n , \ b ...) и в качестве оператора цитирования для регулярных выражений ( \. или \ $ ... чтобы удалить их особое значение оператора регулярного выражения). POSIX в настоящее время неясен (и даже не соответствует действительности в некоторых случаях) в некоторых случаях (например, на /\\./ или / \ 56 / или / [\ 135] / ). Опять же, использование ENVIRON может помочь, хотя и не всегда. Например:

R='[\]' awk '$0 ~ ENVIRON["R"]'

предназначен для сопоставления с обратной косой чертой в POSIX, но возвращает ошибку во всех известных мне реализациях awk . Лучше всегда избегать \ даже внутри [...] , если понимать это буквально, на всякий случай.

Обратите внимание, что для раковины fish вам понадобится еще один слой экранирования, как для fish (в отличие от большинства других раковин), \ является особенным в одиночном цитаты. Итак, вам нужно:

awk -F'|' '$12 == "\\\\N"'

там. Хотя

awk -F'|' '$12 == "\\\N"'

тоже будет работать.

env 'V=\N' awk -F'|' '$12 == ENVIRON["V"}'

также должно работать (в fish и других семействах раковин).

2
28.12.2016, 00:38
1 ответ

disown предотвратит получение вашим приложением сигнала SIGHUP при выходе из SSH. Однако, если приложение впоследствии выполняет запись в отозванный pty, оно получит сигнал SIGPIPE . Если вы не обрабатываете или не игнорируете SIGPIPE , он по умолчанию убивает ваше приложение.

Если приложение обрабатывает SIGPIPE , то его попытки записи возвращают статус ошибки, а затем приложение решает, игнорирует ли оно ошибку, прерывает или делает что-то еще. (Игнорирование ошибок редко бывает разумным.)

Если вы просто хотите получить самый простой способ предотвратить смерть вашего приложения и не хотите перенаправлять его в файл, рассмотрите возможность запуска его внутри экрана или tmux , или использовать mosh вместо ssh .

3
27.01.2020, 22:03

Теги

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