1

Мои коллеги пишут сценарии с такими строками:

echo "nightly $MACHINE restart begins at" `date`

Который выводит что-то вроде этого:

nightly whitestar restart begins at Mon Oct 13 22:05:01 EDT 2014

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

`date`

Это не самый эффективный способ вывода даты, основанный на онлайн-дискуссиях о подоболочках (и мое общее презрение к обратным ссылкам).

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

3 ответа3

4

В чистом /bin/sh , date нереста является основным способом. Но это не так уж и плохо - и Linux, и BSD довольно быстро создают новые процессы, и двоичный файл date будет некоторое время кэшироваться в памяти. Если вам не нравятся обратные пометки, $(this syntax) обычно предпочтительнее их.

Вы можете изменить формат даты, используя date +fmt , задав ему стиль strftime():

echo "nightly $MACHINE restart at $(date +"%F %T %z")"
echo "$(date +"%F %T %z"): $MACHINE: nightly restart"

...Фактически, вы можете расширить опцию формата даты, чтобы заставить date печатать всю строку - до тех пор, пока вы избегаете или экранируете символы % в переменных:

date +"%F %T %z: $MACHINE: nightly restart"

В оболочке Bash вы можете заменить echo на printf и использовать специальный спецификатор формата %(fmt)T , который снова принимает формат strftime():

printf "%(%F %T %z)T: %s: nightly restart\n" "$MACHINE"

Во всех вышеприведенных примерах %F %T %z (или полная версия %Y-%m-%d %H:%M:%S %z) является форматом даты «модифицированный ISO 8601 ». (Обычный ISO 8601 был бы %FT%T%z или %Y-%m-%dT%H:%M:%S%z , немного менее читаемый.) Любой из них, как правило, является лучшим выбором при форматировании дат для будущего разбора.

Наконец, вы можете полностью забыть об echo и записывать данные непосредственно в системный журнал. Большинство операционных систем поставляются с функцией logger для отправки в системный журнал:

logger -s -p user.notice "nightly restart"

Системный журнал будет автоматически хранить дату и время, а также имя хоста.

1

Многие люди не понимают, что сама date(1) может использоваться вместо эха, а сообщение является частью формата. Например:

date '+%D %T nightly restart'

это легче и проще, чем обычное получение вывода даты обратными метками. Если они не перенаправлены в лог-файл, лог-сообщения, вероятно, следует отправлять в stderr а не в stdout:

date '+%D %T nightly restart' 1>&2

Это мой любимый метод. Единственная лучшая альтернатива - как указывалось выше, - использовать встроенную в bash реализацию printf(1) . Недостатком, конечно, является то, что ваш скрипт становится bash-only ...

Если вам нужна запись для перехода к syslogd, вам следует использовать logger(1)-s) - как подсказывает гравитация - просто помните, что флаг доступен не во всех системах. Например, это - довольно досадно - отсутствует в Solaris, включая Solaris-10. (Не случайно определение LOG_PERROR (которое некоторые реализации syslog(3) распознают) также отсутствует в "Slowlaris" ...)

0

Лечо 0,3

Для входа в прошлом мы использовали следующее:

server=$( uname -n )
lecho() {
   now=$( date '+%Y-%m-%d %T' )
   printf "[%19s]%s@%s\n: %s\n" "$now" "$USER" "$server" "$@"
}

# ...

lecho "BEGIN nightly restart"

Изменить: Когда вы делаете много из них, printf быстрее, чем эхо. Кроме того, форматирование выходных данных очень полезно при последующем поиске.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .