Этот вопрос здесь уже есть ответ:
Я использую 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
, они работают нормально.
Что может быть не так с приведенным выше кодом? Спасибо,
Если я выполню:
su USERNAME
sudo cat <<- 'EOF' > cron.jobs
* * * * * CRON TASKS...
EOF
, я получу:
bash: cron.jobs: Permission denied
Если бы я использовал файл, я бы просто сменил владельца, группа и разрешения, как в sudo chmod + x / home / user / Location / Of / Script
, но, учитывая, что это heredoc, я думаю, это не так.
Несмотря на это отмечаемое как дубликат, я ответил на это, потому что проблема была то, что оба синтаксис 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 -