Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Вывод результата работы задания из Crontab в файл.  (Прочитано 4311 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн i81

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Не стоит перенаправлять ошибки
Простите, не понял к какой части моего файла это утверждение? В чём отличия Вашего варианта, можете подсказать? Кроме указания относительного пути вместо моего постоянного?

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28366
    • Просмотр профиля
Кроме указания относительного пути вместо моего постоянного?
Это какой язык сейчас был?
Где вы в моём скрипте нашли относительные пути и что в вашем понимании "постоянные"?
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн i81

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
что в вашем понимании "постоянные"?
У меня /home/igor/, у Вас $HOME
{Как я писал выше - я только учусь на очень начальной стадии обучения потому прошу делать небольшую скидку}

Можно пояснить действия Вашего скрипта? Я понимаю так:
1. exec >> "$HOME/logs/$( date "+%F-%T" ).log" - записывает лог в файл /home/{директория пользователя}/logs/{да так время}.log
2. "$HOME/onedrive/onedrive" --synchronize - запускает синхронизацию.

Я не вижу отличия от того, что я написал, кроме неявного указания пути. Но т.к. исполняемый файл я тупо переделал с другого не шибко вникая в происходящее, я предполанаю, что возможны и другие отличия у Вас, про которые я просто не знаю... Вот и прошу Вас объяснить.

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28366
    • Просмотр профиля
У меня /home/igor/, у Вас $HOME
И?

- записывает лог в файл /home/{директория пользователя}/logs/{да так время}.log
Нет. Команда exec без параметров переустанавливает файловые дескрипторы самого шелла.
Она ничего не "записывает", она говорит шеллу, что "весь вывод теперь писать сюда, куда бы ты ни писал его до того".

неявного указания пути.
Чо?…
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн i81

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
И?
Чо?…
Не пойму, Вы и правда не понимаете или просто издеваетесь?
Если другой пользователь запустит  этот скрипт то лог будет писаться в другую папку, да и onedrive будет пытаться запуститься из другого (не существующего) места.



Команда exec без параметров переустанавливает файловые дескрипторы самого шелла.
Она ничего не "записывает", она говорит шеллу, что "весь вывод теперь писать сюда, куда бы ты ни писал его до того".
Т. е. В моём скрипте  сначала обновляется настройка вывода лога вникуда, а потом сама команда синхронизации выводит весь результате своих действий в указанный файл. В то время, как у Вас сначала задаётся файл вывода результата действий, а потом выполняется команда. Если смотреть применительно к моему примеру (когда команда, выполняемая файлом, одна) разве это важно?

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28366
    • Просмотр профиля
Не пойму, Вы и правда не понимаете или просто издеваетесь?
Я пытаюсь навести вас на мысль, что ваша терминология далека от удовлетворительной, как и объём ваших знаний.
И вместо того, чтобы качать права, достаточно просто спросить.

разве это важно?
Ну вообще да, но в данный момент нет.
Раз уж пользуетесь exec, пользуйтесь им правильно.
И, да, есть принципиальная разница между моим и вашим скриптом, я её озвучил ранее.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн i81

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
И вместо того, чтобы качать права, достаточно просто спросить
Я прошу прошения, но ведь я именно это и делаю - просто спрашиваю. При и не единожды писал про свой полностью нулевой уровень знаний. Вы же отвечаете намёками, вместо того, что бы просто помочь и объяснить. Лениво/недостойно Вас - так тогда вообще не стоит писать. Или у Вас такой способ самоутвердиться?
И, да, есть принципиальная разница между моим и вашим скриптом, я её озвучил ранее.
Вы много чего озвучили, простите но именно этот момент я не уловил (возможно не понял просто) будьте добры повторится и, по возможности подробнее (или с примером) в чем разница в скриптах?

Пользователь добавил сообщение 11 Ноября 2019, 04:22:50:
Друзья, а появилась у меня ещё одна "хотелка": складывать логи по дням в папки.
Попробовал по аналогии с виндой - не выходит - не хочет linux создавать не существующую папку.
igor@nas:~$ /home/igor/onedrive/onedrive --synchronize >> "/home/igor/log/"`date +"%F"`"/`date +"%F-%T"`.log" 2>&1
-bash: "/home/igor/log/"`date +"%F"`"/`date +"%F-%T"`.log": Нет такого файла или каталога
Подскажитие пожалуйста, как всё же правильно модифицировать скрипт, что бы при запуске создавалась папка текщеё даты и в неё складывались файлы.
Попробовал вот так:
#!/bin/sh


exec >> /dev/null

mkdir "/home/igor/log/`date +"%F"`"

/home/igor/onedrive/onedrive --synchronize >> "/home/igor/log/`date +"%F"`/`date +"%F-%T"`.log" 2>&1
Вроде работает, но каждые последующие запуски вызывают ошибку mkdir: невозможно создать каталог «/home/igor/log/2019-11-11»: Файл существует которая вроде как на работу не влияет, но всё же ошибка...
Я понимаю, сто перед созданием необходимо проверять наличие папки. Но вот как это сделать?

Пользователь добавил сообщение 11 Ноября 2019, 05:02:34:
Пока придумал следующее:

#!/bin/sh



if [ -d /home/igor/log/`date +"%F"` ];
        then
                /home/igor/onedrive/onedrive --synchronize >> "/home/igor/log/`date +"%F"`/`date +"%F-%T"`.log" 2>&1;

        else
                mkdir "/home/igor/log/`date +"%F"`";
                /home/igor/onedrive/onedrive --synchronize >> "/home/igor/log/`date +"%F"`/`date +"%F-%T"`.log" 2>&1;

fi


Заодно разобрался что такое exec >> /dev/null в моём предыдущем посте - решил его убрать.
« Последнее редактирование: 11 Ноября 2019, 05:02:34 от i81 »

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6906
    • Просмотр профиля
Цитировать
как всё же правильно модифицировать скрипт
Почитай. Когда мне нужна подсказка, то я обращаюсь к ней.
Пара примеров.
`date +"%F"`Правильно, но напрасно перешел на "устаревшую" запись. Такой вариант "безопасней":
$(date +"%F")Так правильно:
if [ -d /home/igor/log/`date +"%F"` ];
        then
                /home/igor/onedrive/onedrive --synchronize >> "/home/igor/log/`date +"%F"`/`date +"%F-%T"`.log" 2>&1;

        else
                mkdir "/home/igor/log/`date +"%F"`";
                /home/igor/onedrive/onedrive --synchronize >> "/home/igor/log/`date +"%F"`/`date +"%F-%T"`.log" 2>&1;

fi
А так короче:
[ ! -d /home/igor/log/`date +"%F"` ] && mkdir "/home/igor/log/`date +"%F"`"
/home/igor/onedrive/onedrive --synchronize >> "/home/igor/log/`date +"%F"`/`date +"%F-%T"`.log" 2>&1
Надеюсь не наделал ошибок. Я тоже не гений, во первых. Во вторых, отредактировал твой код.
Цитировать
Если другой пользователь запустит  этот скрипт то
Плохая идея, если другой пользователь имеет доступ в ваш домашний каталог. А если скрипт предназначен для разных пользователей, то и помещать его нужно в "общедоступное место".
« Последнее редактирование: 11 Ноября 2019, 06:03:10 от andytux »

Оффлайн i81

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
А так короче:
он короче по написанию или по скорости работы?
Мне тот, если честно более наглядно понятен.

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6906
    • Просмотр профиля
Цитировать
короче по написанию или по скорости работы?
В теории, чем короче программа, тем меньше ресурсов, тем быстрее. На практике, в данном конктретном случае, на одной стоке реальной выгоды не заметишь.
Зависит в какие конкретно машинные команды интерпретатор преобразует этот код. Может даже в одинаковые.
На счет наглядности, тоже дело вкуса. Две строки нагляднее чем семь.
Насчет понятности, вторая строка выполняется всегда. Первая строка проверяет условие. Если каталога нет, то создается. Если есть, то переходит к следующей строке.
« Последнее редактирование: 11 Ноября 2019, 07:35:20 от andytux »

Оффлайн i81

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
В теории
Большое спасибо за объяснения и интересную ссылочку!

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
перед созданием необходимо проверять наличие папки
Не нужно если использовать mkdir с опцией --parents
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн i81

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
mkdir с опцией --parents
Ой! Вот это СПАСИБО ОГРОМНОЕ!
Сколько я намучался с этим поэтапным созданием каталогов. В винде, получается этот ключ по умолчанию, а тут вот мучался :(
Не нужно
Ну в моем случае все таки нужно проверять т.к. мы же не папку изначально создаём, а текстовый файл >> "/home/igor/log/`date +"%F"`/`date +"%F-%T"`.log", который не создастся в случае отсутствия папки. Или и тут есть какой-то хитрый ключик?

П.с. друзья, не кидайте пожалуйста тапками, но я не знаю, что означает ключ 2>&1 подсмотрел его в инете на схожей задачи, а что значит - не пойму. Подскажите пожалуйста.

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6906
    • Просмотр профиля
В двух словах не расскажешь, ибо нюансов там немало. А ты книжечку почитай про "перенаправление".

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
i81, конечно, вопросы задавать проще чем изучить азы. Но дело в том, что недостаточность основ будет и в дальнейшем вызывать непонимание.
Существует понятие как "стандартный вывод" (stdout)- это сюда выводятся сообщения системы. Обозначается в скриптах как "1>" или просто ">". Кроме него существует "вывод ошибок" (stderr), который обозначается "2>". Стандартно каждый "привязан" к терминалу, что можно изменить переназначив вывод например в файл, в том числе с помощью команды exec
Выражение же
2>&1
означает "ошибки выводить туда же, куда направлен основной вывод".
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.036 секунд. Запросов: 25.