LINUX.ORG.RU

Обработка date в bash и из cron


0

1

У меня есть бэкап-скрипт, который сохраняет особо важные данные на примонтированный nfs-раздел, создавая каталоги вида «2011-Mar-01--23_44_12»:

Выглядит он так: backup -o /mnt/dlink/$(date +%Y\-%b\-%d\-\-%k\_%M\_%S)/

Когда я запускаю его из bash всё отлично. Но когда я поместил его в cron, создаваемые каталоги стали иметь вид «2011-Mar-01--», то есть без указания времени создания.

С чем это связано и как починить ? Подозреваю, что при отработке из cron скрипт может обрабатываться не bash а sh или чем-то ещё ?

Спасибо заранее.

кстати лучше создать переменную, например

DIR=$(date +%Y-%b-%d--%k_%M_%S)
и использовать ее
backup -o /mnt/dlink/$DIR/

outsider ★★
()
Ответ на: комментарий от outsider

Про переменную - ок понял. Зачем экранировать уже не помню, кажется, без экранирования на нфс как-то криво создавалось имя файла. Давно делал, забыл.

gregg128
() автор топика
Ответ на: комментарий от outsider

>лучше создать переменную

Чем лучше, не поясните?

anonymous
()
Ответ на: комментарий от gregg128

По поводу ловли блох лучше делать так:


#!/bin/bash
#MikeDM 2010

FLOG="/var/log/backup.log"

putlog(){
        echo "$(date +%Y-%m-%d\ %H:%M:%S ) $1" >> $FLOG
}

#тест без выхода при ошибке
ltesth(){
   
if [[ $1 == "0" ]]
        then putlog "SUCCESS" ;
        else putlog "FAILURE. error code $1. skip exit" ;
fi

}


#тест с выходом при ошибке
ltest(){
   
if [[ $1 == "0" ]]
        then putlog "SUCCESS" ;
        else putlog "FAILURE. error code $1. exit" ; m_stop ; exit 1;
fi

}

#clear pre data
putlog "clear taget dir $TARGET_DIR  Операция после отказа которой надо завершить работу скрипта ибо продолжать дальше нет смысла"
rm -rf $TARGET_DIR/*
ltest $?

putlog "Операция после отказа которой не надо завершать работу скрипта"
umount /mnt/snap
ltesth $?


# ну и дальше в том же духе 

MikeDM ★★★★★
()

>Когда я запускаю его из bash всё отлично. Но когда я поместил его в cron, создаваемые каталоги стали иметь вид «2011-Mar-01--», то есть без указания времени создания.

ибо

`%k'

hour (` 0'...`23'). This is a GNU extension.

Когда вы доки начнёте читать?! это GNU расширение, и в POSIX оно не работает. А скрипты именно так выполняются.

drBatty ★★
()
Ответ на: комментарий от drBatty

Мне man date выдаёт
...
%I hour (01..12)

%j day of year (001..366)

%k hour ( 0..23)

%l hour ( 1..12)

%m month (01..12)
...

То есть ни звука о GNU-расширениях.

cat /etc/issue
Debian GNU/Linux 5.0 \n \l

anonymous
()
Ответ на: комментарий от anonymous

То есть ни звука о GNU-расширениях.

не дочитали:

SEE ALSO The full documentation for date is maintained as a Texinfo manual. If the info and date programs are properly installed at your site, the command

info coreutils 'date invocation'

should give you access to the complete manual.

drBatty ★★
()
Ответ на: комментарий от drBatty

Можно раскрыть тему?

это как надо запустить скрипт, чтобы date отключил свои GNU extensions?

Я еще понимаю если он перенесет скрипт с GNU extensions на платформу без GNU/coreutils

sdio ★★★★★
()
Ответ на: комментарий от sdio

это как надо запустить скрипт, чтобы date отключил свои GNU extensions?

File: coreutils.info, Node: Standards conformance, Prev: Special built-in utilities, Up: Common options

2.13 Standards conformance ==========================

In a few cases, the GNU utilities' default behavior is incompatible with the POSIX standard. To suppress these incompatibilities, define the `POSIXLY_CORRECT' environment variable. Unless you are checking for POSIX conformance, you probably do not need to define `POSIXLY_CORRECT'.

Newer versions of POSIX are occasionally incompatible with older versions. For example, older versions of POSIX required the command `sort +1' to sort based on the second and succeeding fields in each input line, but starting with POSIX 1003.1-2001 the same command is required to sort the file named `+1', and you must instead use the command `sort -k 2' to get the field-based sort.

The GNU utilities normally conform to the version of POSIX that is standard for your system. To cause them to conform to a different version of POSIX, define the `_POSIX2_VERSION' environment variable to a value of the form YYYYMM specifying the year and month the standard was adopted. Two values are currently supported for `_POSIX2_VERSION': `199209' stands for POSIX 1003.2-1992, and `200112' stands for POSIX 1003.1-2001. For example, if you have a newer system but are running software that assumes an older version of POSIX and uses `sort +1' or `tail +10', you can work around any compatibility problems by setting `_POSIX2_VERSION=199209' in your environment.

хотя у меня всё равно %k работает... Видимо в стандарте POSIX просто нет %k, а следовательно её поведение не определено. Подозреваю, что у ТС две date - первая лежит в /bin/ и нужна при инициализации ОС, а вторая в /usr/bin/

У меня в /usr/bin симлинк на /bin/date.

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.