Ubuntu Bash cron heredoc не работает [дубликат]

Этот вопрос здесь уже есть ответ:

Я использую Ubuntu 16.04 и вхожу на удаленную машину как пользователь root , а затем выполняю следующий сценарий которому необходимо добавить некоторые запланированные задачи в Unix cron:

#!/bin/bash

su USERNAME

crontab -l 2>/dev/null

cat <<- 'EOF'

       * * * * * cron-task1...
       * * * * * cron-task1...

       * * * * * cron-task2...
       * * * * * cron-task2...

       * * * * * cron-task3...
       * * * * * cron-task3...

EOF

exit

По какой-то причине этот код не работает, т.е. после выполнения, задачи cron не будут напечатаны в cron из heredoc , но коды задач в порядке, как будто я копирую их вручную, как в crontab -e , они работают нормально.

Что может быть не так с приведенным выше кодом? Спасибо,


Обновление для Chev_603:

Если я выполню:

su USERNAME

sudo cat <<- 'EOF' > cron.jobs
* * * * * CRON TASKS...
EOF

, я получу:

bash: cron.jobs: Permission denied

Если бы я использовал файл, я бы просто сменил владельца, группа и разрешения, как в sudo chmod + x / home / user / Location / Of / Script , но, учитывая, что это heredoc, я думаю, это не так.

0
задан 18 November 2016 в 16:16

1 ответ

Несмотря на это отмечаемое как дубликат, я ответил на это, потому что проблема была то, что оба синтаксис cat и crontab были выключены.

Нет никакого существующего crontab, и Ваш синтаксис выключен. Например, если я делаю это без настроенного крона, это происходит:

$ crontab -l
no crontab for anon

И, чем Вы просто отправляете содержание сюда документ stdout.

Поэтому сначала создайте crontab файл как это:

cat <<- 'EOF' > cron.jobs

   * * * * * cron-task1...
   * * * * * cron-task2...
   * * * * * cron-task3...

EOF

crontab cron.jobs

Чем подтверждают, что это работало:

crontab -l
 * * * * * cron-task1...
 * * * * * cron-task2...
 * * * * * cron-task3...

Причина, почему это не работало, состоит в том потому что crontab -l просто отображает содержание пользовательского файла крона к stdout:

От man crontab:

   The -l option causes the current crontab to be displayed on standard output. See the note under DEBIAN SPECIFIC below.

Кроме того, вместо использования su , можно использовать

cat cron.jobs |crontab -u user -

Соединение всего этого, добавляет это к сценарию, говорит cron.sh и попробуйте это:

#!/bin/bash
user="$@"
cat <<- 'EOF' > cron.jobs

   * * * * * cron-task1...
   * * * * * cron-task2...
   * * * * * cron-task3...

EOF


cat cron.jobs|crontab -u $user -

И затем:

bash cron.sh username

Но я думаю, для чего Вы шли, больше был похож:

cat <<< '
* * * * *  cron-task1... ' |crontab -
2
ответ дан 28 September 2019 в 04:05

Другие вопросы по тегам:

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