O cron do Ubuntu Bash heredoc não funciona [duplicado]

0

Eu uso o Ubuntu 16.04 e faço login em minha máquina remota como o usuário root e, em seguida, executando o seguinte script que precisa adicionar algumas tarefas agendadas ao cron do Unix:

#!/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

Por alguma razão, este código não funciona, ou seja, após a execução, as tarefas cron não serão impressas no cron a partir do heredoc , mas os códigos de tarefa são bons como se eu copiasse eles manualmente como em crontab -e , eles funcionam muito bem.

O que pode estar errado com o código acima? Obrigado,

Atualização para o Chev_603:

Se eu executar:

su USERNAME

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

Eu recebo:

bash: cron.jobs: Permission denied

Se eu usasse um arquivo, bastaria alterar a propriedade, o grupo e as permissões, como em sudo chmod +x /home/user/Location/Of/Script , mas, considerando que é um heredoc, acho que não é o caso.

    
por JohnDoea 18.11.2016 / 03:50

1 resposta

2

Apesar de esta ser marcada como duplicada, eu a respondi porque o problema era que a sintaxe de cat e crontab estava desativada.

Não há crontab existente e sua sintaxe está desativada. Por exemplo, se eu fizer isso sem nenhum cron configurado, isso acontece:

$ crontab -l
no crontab for anon

E você está simplesmente enviando o conteúdo do documento aqui para stdout.

Primeiramente, crie um arquivo crontab como este:

cat <<- 'EOF' > cron.jobs

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

EOF

crontab cron.jobs

Em vez de confirmar, funcionou:

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

A razão pela qual não estava funcionando é porque crontab -l simplesmente exibe o conteúdo do arquivo cron do usuário para stdout:

De man crontab :

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

Além disso, em vez de usar su , você pode usar

cat cron.jobs |crontab -u user -

Juntando tudo, adicione isso a um script, diga cron.sh e tente isto:

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

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

EOF


cat cron.jobs|crontab -u $user -

E então:

bash cron.sh username

Mas acho que o que você estava procurando era mais ou menos como:

cat <<< '
* * * * *  cron-task1... ' |crontab -
    
por Chev_603 18.11.2016 / 04:19