Como adiciono uma entrada ao meu crontab?

13

Estou usando o crontab pela primeira vez. Deseja escrever algumas tarefas cron de teste muito simples e executá-las.

$crontab * * * * * echo "Hi"

não produz nada.

crontab */1 * * * * echo "hi"

diz */1: No such file or directory.

Além disso, como faço para listar as tarefas cron atualmente em execução (não apenas as que possuo, mas as iniciadas por outros usuários, como root).

E como eu excluo uma tarefa cron específica?

xyz
fonte
Para obter instruções sobre como editar e criar tarefas cron e uma explicação sobre a estrutura dos arquivos, consulte este guia de sintaxe crontab
KJS

Respostas:

21

Você não pode usar crontabassim. Use man crontabpara ler sobre a maneira correta de chamar este utilitário.

Você deseja usar crontab -epara editar as entradas cron do usuário atual (você pode adicionar / modificar / remover linhas). Use crontab -lpara ver a lista atual de tarefas configuradas.

Quanto à visualização das crontabs de outros usuários, isso não é possível sem ser root nas instalações padrão. Consulte Como listar todos os trabalhos do cron para todos os usuários para obter algumas maneiras de listar tudo (como raiz).

Nota: tenha muito cuidado ao usar caracteres globbing do shell na linha de comando ( *e ?especialmente). *será expandido para a lista de arquivos no diretório atual, o que pode ter efeitos inesperados. Se você deseja passar *como argumento para algo, cite-o ( '*').

Esteira
fonte
então eu crontab -e e no editor coloquei a entrada * / 1 * * * * echo "hi" e quando eu salvo esse arquivo, vejo a mensagem crontab: instalando o novo crontab. mas não vejo as mensagens oi aparecendo na tela. O que estou perdendo agora? obrigado.
Xyz
2
A saída do crontab nunca irá para a sua "tela". Na página do manual POSIX do crontab: "Se a saída padrão e o erro padrão não forem redirecionados por comandos executados a partir da entrada do crontab, qualquer saída ou erro gerado será enviado por correio, através de um método dependente da implementação, para o usuário".
Tapete de
1
A saída do trabalho será enviada para a caixa de correio local do proprietário do trabalho. (Correndo maila partir da linha de comando deve acessar sua caixa de correio local, se configurado.) Para ver o 'oi' em ambiente gráfico, você pode definir a tarefa como: * * * * * export DISPLAY=:0; xmessage 'hi'.
manatwork
@manatwork Você também pode precisar de XAUTHORITY, o que pode não ser fácil .
Derobert 20/09/12
7

Existem duas maneiras de editar uma crontab:

  1. interativamente, usando crontab -e, que abrirá o crontabno editor especificado por $VISUALou $EDITOR, ou

  2. de forma não interativa, usando crontab crontab.txt, que simplesmente importará as crontabentradas do arquivo crontab.txt, substituindo o crontab ativo existente para o usuário atual.

O problema que você tem é que você está simplesmente usando o crontabcomando errado.


O seguinte diz respeito à manipulação não interativa de crontab:

Portanto, para remover tarefas específicas programaticamente, você pode fazer algo como

$ crontab -l | grep -v 'PATTERN' >crontab.txt && crontab crontab.txt

onde PATTERNé uma expressão regular que corresponderá às tarefas que você deseja remover. Aqui, crontab -lvocê fornecerá seu atual crontab.

Ou, se você tiver entradas em um arquivo chamado crontab-fragment.txt que deseja remover do crontab ativo,

$ crontab -l | grep -v -Fx -f crontab-fragment.txt >crontab.txt && crontab crontab.txt

Isso lê o crontab atual e filtra (remove) qualquer linha que também ocorra no arquivo crontab-fragment.txtno diretório atual (usando uma comparação de cadeias de linhas completas). O resultado é salvo crontab.txte carregado a partir daí para substituir o crontab atual.

Para adicionar uma ou várias tarefas , faça algo como

$ crontab -l | cat - crontab-fragment.txt >crontab.txt && crontab crontab.txt

Isso pressupõe que o arquivo crontab-fragment.txtcontenha as entradas que você deseja adicionar. Ele lê o crontab atual, acrescenta as entradas de crontab-fragment.txtpara isso e cria crontab.txt. O crontab.txtarquivo substitui o crontab atual.

Kusalananda
fonte
2

Se você deseja modificar o crontab interativamente, execute o comando crontab -e, sem nenhuma outra opção. Isso iniciará um editor em uma cópia do crontab; Quando você sair do editor , a cópia editada se tornará o novo crontab. Você pode controlar qual editor é iniciado pelas variáveis ​​de ambiente VISUALeEDITOR . Para listar seu crontab, execute crontab -l.

Se você deseja modificar o crontab em um script, defina VISUALe EDITORno caminho para um script ou para um snippet de shell que modifique o arquivo fornecido no local. O editor edé uma possibilidade aqui, ou sed -ise a sua implementação sedtiver essa opção. Se você deseja adicionar uma linha incondicionalmente, pode usar echo … >>. Tome cuidado ao citar; em caso de dúvida, escreva um script e passe o nome do script como EDITOR.

script=$(mktemp)
cat <<'EOF' >"$script"
#!/bin/sh
ed -s "$1" <<'EOS'
g/^ *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *echo "hi"$/d
$a
* * * * * echo "hi"
.
w
q
EOS
EOF
Gilles 'SO- parar de ser mau'
fonte
2

É um pouco tarde, mas para outros que procuram aqui. Existem maneiras mais fáceis do que manipular os fluxos de entrada / saída com VISUALeEDITOR .

Você pode simplesmente escrever sua programação cron em um arquivo, 1 trabalho por linha, e usar o comando crontab [filename]para poder colocar catseus trabalhos emfilename como parte do seu script e, finalmente, chamar o crontab no final, se quiser.

na verdade, esse é o uso mais comum como man crontabdicas, listando-o primeiro

Lindsay Ryan
fonte
2

Se você deseja adicionar entradas ao crontabpor automação ou a partir da linha de comando, você pode fazer (definir os horários que deseja ter)

echo "* * * * * /yourpath/yourcommand 2>&1 >> /var/log/somelog.log" >> /var/spool/cron/root (or appropriate username)

Então:

service crond reload

para recarregar os crontabs.

Chris Sprucefield
fonte
Isso não é portável; nem todos os unix armazenam os arquivos crontab /var/spool/cron. Uma maneira melhor seria através do crontab(1)comando.
thrig
Isso pode ser verdade, mas foi para mostrar o princípio de como você pode fazer isso em um sistema, e sim, o crontab faz o truque se você deseja adicionar linha por linha. Não era para ser uma resposta absoluta, mas uma se você souber onde estão as suas coisas e precisar adicionar em massa. Pegue, leve pelo que é.
Chris Sprucefield
1

Experimente com este comando:

crontab -e 

adicione seu trabalho cron:

*/1 * * * * echo "hi"

nesse arquivo.

user158204
fonte
0

Gostaria de destacar a maneira que descrevo abaixo, apesar de já ter sido mencionado antes em outro comentário. Achei extremamente útil ao adicionar as entradas a um arquivo e adicionar o arquivo ao crontab. Esse arquivo conteria as duas entradas abaixo e o nome do arquivo seria hello-world-crontab.txt.

  • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • 0 09 * * * python /home/user/greeting.py

Em seguida, executei o comando abaixo para adicionar essas entradas ao crontab.

  • $ crontab hello-world-crontab.txt

O próximo passo é verificar se essas entradas foram adicionadas.

  • $ crontab -l

Uma breve explicação sobre o que cada entrada faz:

  • Esta entrada do crontab escreve "Olá, mundo!" no arquivo /home/user/greeting.txttodos os dias às 9h.
    • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • Este crontab executa um arquivo python que é impresso na linha de comando 'Hello world!' todos os dias às 9 da manhã.
    • 0 09 * * * python /home/user/greeting.py
SylvesterAbreuLoreto
fonte