Кажется, что все процессы игнорируют определенные сигналы.

В ksh , bash и zsh , время не является командой (встроенной или нет), это зарезервированное слово в язык вроде для или , а .

Используется для измерения времени конвейера 1 .

In:

time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir

У вас есть специальный синтаксис, который сообщает оболочке запустить этот конвейер:

for i in 1 2; do cmd1 "$i"; done | cmd2 > redir

И сообщить статистику времени для него.

В:

time cmd > output 2> error

То же самое, вы синхронизируете команду cmd> output 2> error , а статистика синхронизации по-прежнему отправляется в stderr оболочки.

Вам необходимо:

{ time cmd > output 2> error; } 2> timing-output

Или:

exec 3>&2 2> timing-output
time cmd > output 2> error 3>&-
exec 2>&3 3>&-

Чтобы stderr оболочки был перенаправлен на time-output до того, как будет использована конструкция времени (опять же, не команда ) ( здесь время cmd> output 2> error 3> & - ).

Вы также можете запустить эту конструкцию time в подоболочке , у которой перенаправлен stderr:

(time cmd > output 2> error) 2> timing-output

Но эта подоболочка здесь не нужна, вам нужно только перенаправить stderr в время вызова конструкции time .

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

'time' cmd > output 2> error-and-timing-output

Но будьте осторожны, формат может быть другим, и stderr для time и cmd будет объединен в error-and-time-output .

Кроме того, команда time , в отличие от конструкции time , не может синхронизировать конвейеры, составные команды, функции или встроенные функции оболочки ...

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


1 Обратите внимание, что bash имеет (что можно рассматривать как) ошибку , при которой time (cmd) 2> file (но не time cmd | (cmd2) 2> file например) перенаправляет вывод синхронизации в файл

0
25.03.2019, 18:55
1 ответ

Для всех, кто сталкивается с подобной проблемой, в данном конкретном случае проблема была вызвана ошибкой в ​​виртуальной машине Ruby версии 1.27.4, которая была установлена ​​на этих облачных серверах как часть образа.

Ошибка RVM заключалась в сценариях, которые переопределяли обычные функции (, такие как cd ), где SIGINT перехватывался, но не освобождался при очистке. Более подробную информацию можно найти здесь Ошибка Ruby RVM

Исправление в этом случае заключалось в обновлении RVM до последней стабильной версии (, в данном случае 1.29.7 ).

curl -sSL https://get.rvm.io | bash -s stable --ruby

Спасибо mosvy за указатель.

0
28.01.2020, 03:53

Теги

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