Comandos e dicas para agendar execução de programas e scripts.
Os comandos e dicas podem não atender as suas necessidades, não ser compatível com sua instalação, use como referencia, tente adaptar ao seu ambiente.
O daemon do agendador de tarefas cron é o crond, ele faz a verificação das tarefas agendadas, portanto precisa dele rodando para executar as tarefas.
Na maioria das distro e perfis de instalação, o agendador de tarefa é instalado automaticamente, também é configurado na instalação para iniciar junto com o boot. Caso selecionou perfil de instalação que não inclua o pacote, este pode ser instalado a qualquer momento, procure no seu gerenciador de pacotes por; cron, crond, vixie-cron, crontabs e outros termos semelhantes a cron.
Depois de instalar confira se o serviço está rodando, este comando muda conforme a distro, no FAQ iniciar.txt tem diversas dicas sobre chkconfig, service e etc.., confira também nos tutoriais sobre as distro para descobrir o comando da sua distro, segue alguns exemplos.
SUSE 10.1 o daemon é cron
service cron status
Quando está rodando retorna (running)
Checking for Cron: running Verificar se está configurado para iniciar no boot chkconfig --list cron cron 0:off 1:off 2:on 3:on 4:off 5:on 6:off
CL10 o daemon é crond
chkconfig crond on
Configura para iniciar o crond junto com o boot, no níveis 3 e 5, ou seja tanto para boot em modo texto como gráfico.
[zago@faqcl9 zago]$ chkconfig --list crond crond 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
Conferir se está rodando, status.
service crond status
Quando OK retorna.
``crond (pid 1136) está rodando... ``
Agendador de tarefas em ambiente gráfico - KDE.
kcron = Agendador de Tarefas do KDE
Procure no menu do KDE por kcron, ou pelo atalho.
menu K -> executar comando, digite na caixa de comando: kcron
Ou ALT+F2 digite na caixa de comando: kcron
Ou na linha digite na linha de comando: kcron
Executar como root, gerenciar todas as tarefas agendas e agendar tarefas como root, no konsole torne root e digite: kcron
Funciona também via ssh, veja no FAQ sobre ssh, como executar aplicativos do X remotamente.
Instalar, procure "kcron" no seu gerenciador de pacotes.
Alarme = no KDE procure por "cron_alarm" mais sobre ele em:
cron_alarm A very simple script to play amarok from cron with a playlist. It will start amarok if it is not started. It will also set the volume (default 65).
Procure também "KAlarm"
webmin
tem modulo para agendar tarefas. na aba "sistema" procure pelo ícone
"Comandos Agendados" e "Tarefas Agendadas (Cron)".
Agendar para um único evento, formato do comando:
at [opção] [comando/arquivo] [tempo]
SUSE 10.1 precisa iniciar o daemon atd com o comando.
rcatd start
Exemplos de comando no CL10
exemplo; desligar o micro às 18:08
[root@faqcl10 root]# at 18:08 at> halt -p at> <EOT> warning: commands will be executed using /bin/sh job 1 at 2004-07-31 18:08 Ou Ou [root@faqcl10 etc]# man at [root@faq188 etc]# at now+2minutes at> mozilla at> [1]+ Stopped at now+2minutes
Use CTRL+Z encerra entradas de comandos e salva.
No exemplo acima precisa digitar todos os dados, comandos complexos ou que se repetem eventualmente, fica mais pratico colocar todos os comandos em script e executar com a opção -f como neste exemplo.
at -f seuscript.sh 22:30
Quando for somente um comando como executar o mozilla daqui a 20 minutos.
at -f /usr/bin/mozilla now+20minutes
Ou se preferir, crie um arquivo com caminho do mozilla, por exemplo:
cat atmozilla
/usr/bin/mozilla
Executar daqui a 20 minutos:
at -f atmozilla now+20minutes
ou se preferir definir a hora, por exemplo às 12:22:
at -f atmozilla 12:22
zago@faqcl10 zago]$ at -f atmozilla 12:22 warning: commands will be executed using /bin/sh job 1 at 2004-09-27 12:22
atq
lista as tarefas agendadas pelo at e o numero do job atrm para excluir do agendamento, use atrm mais o numero do job listado no comando atq
Excluir usuários de usar o AT, configure em:
/etc/at.deny
echo "wget url" | at 05:13
veja também:
man at
at, batch, atq, atrm - agenda, examina ou exclui tarefas para execução posterior
Do man no CL10
at executa os comandos em um determinado momento. atq lista as tarefas pendentes do usuário, exceto quando o usuário é o superusuário; neste caso, as tarefas de todos os usuários são listadas. atrm exclui tarefas.
Executar o script teste.sh daqui a 3 minutos.
at -f teste.sh now+3minute
[root@faqcl10 root]# at -f teste.sh now+3minute warning: commands will be executed using /bin/sh job 1 at 2005-06-13 01:51
Ver o que tem cadastrado, execute "atq" que retorna o numero do PID, data e hora que será executado, exemplo:
[root@faqcl10 root]# atq 1 2005-06-13 01:51 a
Cancelar processos agendados, pegue o numero do PID que retornou no comando "atq" e execute atrm mais no numero do PID, exemplo:
atrm 1
Faça testes e combine com as opções indicadas no manual.
watch executa um programa repetidamente com a periodicidade informada, veja mais sobre ele no man:
man watch
sleep - espera por uma quantidade de tempo especificada
Por default sleep conta o tempo informado em segundos.
sleep 90
provoca uma espera de 90 segundos.
sleep 300
O comando acima espera por 300 segundos, tem o mesmo tempo de 5 minutos igual o comando abaixo.
sleep 5m
Faça testes; use o tempo mais uma destas opções, s=segundos, m=minutos, h=horas e d=dias
esperar 5 minutos ou 5 horas.
sleep 5m sleep 5h
Exemplo de um script com espera 3 segundos para executar novamente o comando smbstatus.
#!/bin/sh while true; do clear smbstatus -S sleep 3 done
CTRL+C encerra o script, altere os comandos do script e tempo do de atualização conforme sua aplicação.
Depurar script, acrescente depois da linha que deseja provocar uma parada para ler a mensagem.
sleep faz parte do pacote coreutils
página do manual;
info sleep
man sleep
usleep
usleep - espera por microsegundos especificado.
usleep - sleep for the specified number of microseconds
man usleep
usleep vem no pacote sysvinit (SUSE)
Neste exemplo, usuário zago agendar para executar script /home/zago/copiaz, todos os dias às 20 horas
script a ser executado:
[zago@faqcl9 zago]$ cat copiaz #!/bin/bash cd /home/zago /bin/tar -zcvf sambaz-`date +%d%m%y`.tar.gz /home/zago/samba
Com o script já testado e tudo Ok, em um terminal como usuário zago, os comandos são:
crontab -e
pressione a tecla INSERT e digite esta linha:
* 20 * * * * /home/zago/copiaz
pressione a tecla ESCAPE depois SHIFT : depois wq pra salvar e sair
prontinho, todos os dias as 20 horas será feito o backup.
Testar script
Tente usar ambiente de teste ou altere os comandos quando for o caso de acessar banco de dados ou informações importantes.
Agende para períodos curtos, inicie com uma tarefa simples, a cada 2 ou 3 minutos.
Assim facilita a depuração e verificação dos resultados.
Usando o script acima como teste, alterei o diretório de backup para pegar outro com poucos arquivos, agendar para ser executado a cada dois minutos, use este exemplo:
*/2 * * * * /home/zago/copiaz
Acompanhe com ls -la, veja o resultado:
[zago@faqcl9 zago]$ ls -la -----corte---- drwx------ 3 zago zago 4096 Jun 14 14:03 Desktop -rwxrwxr-x 1 zago zago 89 Jun 15 08:26 copiaz drwxrwxr-x 2 zago zago 4096 Jun 15 08:21 samba -rw-r--r-- 1 zago zago 580331 Jun 15 08:40 sambaz-150604.tar.gz drwx------ 2 zago zago 4096 Mai 30 02:28 tmp
apague o arquivo criado pelo script e aguarde 3 minutos para ver se ele cria novamente, vai dando ls e apagando o arquivo com rm, assim você faz a verificação do funcionamento do script, depois acerte para o horario desejado.
== Dicas, comandos e depurando script =
Alterar ou acrescentar uma tarefa, edite o crontab com:
crontab -e
Abre o arquivo de configuração com o vi, pressione INS para entrar no modo edição e para sair pressione ESC depois SHFT: depois wq
Caso se arrependa ou queira sair sem salvar, pressione ESC depois SHFT: depois q!
Não precisa reiniciar o serviço, mas precisa do crond rodando.
Para exibir a tabela do cron (ver o que está agendado) digite:
crontab -l
ou
cat /etc/crontab
Cada tabela do cron pertence ao usuário que a criou, somente o root pode ver o que está agendado para outros usuários, execute:
crontab -u < usuário > -l
crontab -u zago -l
Quando falhar a execução de script ou comando, redirecione as mensagens de erro para arquivo, acrescente no final da linha de comando "2>/tmp/crond.log", por exemplo, para a tarefa agendada:
17-23 * * * * /home/anderson/geraiso.sh
Altere para este formato para salvar as mensagens em /tmp/crond.log:
17-23 * * * * /home/anderson/geraiso.sh 2>/tmp/crond.log
Ou salve em outro local, exemplo para salvar no home do usuário zago:
17-23 * * * * /home/anderson/geraiso.sh 2>/home/zago/crond.log
Depois da hora agendada, consulte o arquivo crond.log para ver o motivo do erro.
Permissão:
Quando não criar o arquivo de log, ajuste a permissão do script para 755
chmod 755 nome-do-script
Se ainda falhar, execute o agendamento como root, alguns aplicativos requer poderes de root e permissão 755, como exemplo gravar CD / DVD e muitos outros.
Quando funcionar com root e falhar com user comum, configure o sudo para dar permissão ao usuário executar com poderes de root.
Também tente outras opções no formato da data e hora, tem vasta documentação indicando este formato:
* * * * * * /caminho/aplicativos/comandos
10 20 * * * * /caminho/aplicativos/comandos
Quando falhar, em lugar de espaço como separador entre minutos e hora, utilize (-) ou (,), exemplo:
10-20 * * * * /caminho/aplicativos/comandos
10,20 * * * * /caminho/aplicativos/comandos
Em scripts pode inserir uma linha de criação do arquivo, ou intercalar linhas de comando para acrescentar alguma mensagem em arquivo, pode salvar algum resultado, conteúdo de variável ou mensagem, salvar em arquivo ajuda depurar problemas, depois de executar o script verifique o que foi salvo. Comparar com o que era esperado, por exemplo as linhas abaixo que iniciam com echo servem para este propósito, altere a mensagem que está entre aspas nas linhas que iniciam com echo conforme exemplo:
#!/bin/bash # seus comandos... echo "teste das 20 horas" > /tmp/teste20 #Pode inserir varias linhas no script: #seus comandos... echo "teste das 20 horas OK na linha 2" >> /tmp/teste20 #mais comandos... ls -la >> /tmp/teste20 # mais comandos echo "teste das 20 horas OK na linha 6" >> /tmp/teste20
Depois de executar o script, edite o arquivo /tmp/teste20, encontrando as mensagens é sinal que funciona. Mudando a linha de comando e falhar, então pode ser problema de caminho do executável, permissão e outros problemas não relacionados ao script, nestes casos use testes de execução do comando.
programas para desligar todos os dias às 22:00 horas, no console do root execute whereis poweroff para descobrir o caminho e acrescentar no crontab (crontab -e), exemplo para CL e SUSE.
SUSE 10
10,22 * * * * /sbin/poweroff
Conectiva 10
10,22 * * * * /usr/bin/poweroff
Caso já tenha alguma tarefa agendada, basta acrescentar, copia de uma maquina com agendamento do fetchmail e para desligar.
*/5 * * * * /usr/bin/fetchmail -a 10,22 * * * * /usr/bin/poweroff
ESC :wq
Cuidado com a opção com (*) em lugar dos minutos, (*22) vale para qualquer minuto entre 22 e 23 horas, assim não vai conseguir religar a maquina antes das das 23 horas, neste periodo a maquina desliga logo após o boot porque executa o crontab, a hora coincide e vale para qualquer minuto da hora. com poweroff a melhor solução é definir hora e minuto.
Agendar para executar script periodicamente, tem opções por hora, dia, semana, mês ou ano.
Não confundir com agendamento no crontab onde define a execução de um comando com crontab -e, este comando pode ser a chamada de script ou aplicativo.
Também podemos elaborar script para as mais variadas tarefas como backup, download, upload, gerar relatórios e outra tarefas com repetição periódica.
Pode agendar estas tarefas no crontab ou copiar para dentro de um destes diretórios.
/etc/ cron.d cron.daily cron.hourly cron.monthly cron.weekly
Requer o daemon do cron rodando e reiniciar o serviço depois da copia do script no diretório, o comando muda conforme a distro, no SUSE 10 use (rccron restart), no CL (service cron restart), execute o equivalente em sua instalação. Somente isto, não precisa editar nem configurar nada no crontab, a não ser que deseja alterar a configuração dele, não precisa executar o crontab, basta copiar o script para dentro do diretório desejado que o mesmo será automaticamente executado conforme o horario do crontab.
Para remover do agendamento, remova o script do diretório.
Resumindo, o cron executa tudo que tá lá dentro dos diretórios /etc/cron.
Dentro do script pode incluir rotinas de teste de condição, incluindo teste de quando deve ser executado, veja neste documento o exemplo sobre bittorrent, o script fica no diretório cron.hourly, portanto sendo executado de hora em hora, dentro do script tem um if que permite iniciar as 19 horas e outro que mata o processo às 7 horas, são tarefas que pode agendar no crontab ou até mesmo dentro do script.
Normalmente estes diretórios estão dentro do /etc, como exemplo no SUSE 10, CL9 e 10.
Estes diretórios tem perido pré-definido, observe o nome do diretório, como exemplo o cron.daily executa diariamente os scripts dentro deste diretório.
"diario" daily, "horario" hourly, "mensal" monthly e "semanal" weekly.
A definição do momento (hora e minuto) estão no arquivo /etc/crontab, tem definição de horario diferente conforme a distro e versão, além de consultar o arquivo para ver a configuração, faça testes com um script simples para salvar a data em arquivo, algo como.
#!/bin/bash # seus comandos... echo `date` >> /tmp/testescript.txt echo "teste do script por hora" >> /tmp/testescript.txt
Ajuste a mensagem, torne executável (chmod 755 nomescript.sh), salve dentro do diretório correspondente ao agendamento desejado, depois do momento esperado para executar, consulte o arquivo /tmp/testescript.txt para ver a data e hora em que foi executado, isto não causa dano ao sistema, serve somente como forma de testar o funcionamento de script, veja indicação sobre log de comandos no final deste documento.
Conteúdo de /etc/crontab no SUSE e CL:
SUSE 10.1 cat /etc/crontab SHELL=/bin/sh PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin MAILTO=root # # check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly # -*/15 * * * * root test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1 Ainda não entendi este horario do SUSE, na minha instalação os scripts que estão em /etc/cron.hourly são executados aos 30 minutos de cada hora Conectiva 10 cat /etc/crontab # /etc/crontab: system-wide crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
Em resumo. O sistema executa todos os scripts que estão dentro destes diretórios, serão executados nos dias e horarios definidos em /etc/crontab, basta elaborar o script, tornar executavel, ajustar as permissões e colocar dentro do diretório desejado, horas e minutos podem ser ajustados, edite o /etc/crontab, use seu editor de texto preferido, "mc", "vi" ou outro qualquer para editar texto puro, faça as alterações, faça de modo que não dispare dois serviços ao mesmo tempo, procure programar tarefas para horarios de pouco uso, fora do horario de trabalho, pode incluir comandos no script para testes e desligar o servidor no final do backup e etc...
MAILTO=root
Esta linha no crontab serve para enviar avisos por e-mail, neste exemplo serão enviados para o root, configurar o crontab para não enviar estes e-mail basta trocar (MAILTO=root) por (MAILTO="")
cron.daily
todos os scripts que estão dentro deste sub-diretório serão executados automaticamente todos os dias a zero hora, ou seja com execução diaria, uma vez todo dia a meia noite.
cron.hourly
todos os scripts que estão dentro deste sub-diretório serão executados automaticamente todas as horas, ou seja na hora cheia, uma vez na virada da hora.
cron.monthly
todos os scripts que estão dentro deste sub-diretório serão executados automaticamente todos os meses a zero hora do primeiro dia do mes, ou seja com execução mensal, uma vez todo mês, na virada do mês.
cron.weekly
todos os scripts que estão dentro deste sub-diretório serão executados automaticamente todas as semanas a zero hora do primeiro dia da semana, ou seja com execução semanal, uma vez toda semana, na virada da semana.
Estes diretórios estão vazios, copie o script para dentro deles para serem executados, escolha o diretório conforme o periodo que deseja executar o script, os que devem ser executados de hora em hora vão para o sub-diretório /etc/cron.hourly, com execução diaria vão pra /etc/cron.daily e etc....
Utilize nos comandos do script e no agendador, sempre o (path) caminho completo do aplicativo a ser executado, exemplo para o comando tar, use /bin/tar, também na linha de comando que inserir no cron use o caminho completo para o script, por exemplo, executar um script que está em /home/zago, use a linha: /home/zago/nome-do-script e não somente nome-do-script.
Muito cuidado com scripts, o comodismo pode cair no esquecimento e não atualizar o script de backup quando incluir novos serviços, diretórios ou usuários, monitore constantemente, teste e avalie o que está sendo feito.
Tenha os seguintes cuidados quando elaborar scripts para execução pelo cron.
Nestes scripts não pode conter comandos que requer interação com o usuário, tais como pedir senha para completar a conexão de um ftp, nestes casos deve ser colocado todas as instruções dentro do script de maneira que possa completar a conexão passando o login e senha.
Comandos que requer confirmação para execução, por exemplo, apagar arquivos, o rm pede confirmação, mas com o paramentro -rf não pede, então seria assim:
rm -rf <arquivo, diretório ou /caminho/o que deve apagar>
Não deve ter nenhum comando que peça confirmação ou qualquer interação com o usuário.
Fique atento às permissões, quando possível agende como root para executar o script, use o "sudo" para dar permissões de execução em programas que requer poderes de root na execução, acesso a diretórios de backup e etc....
Espaço em disco quando baixar arquivos, backup ..., comandos de parar serviços ou manipular arquivos em uso. Revise periodicamente scripts que requerem atualização, tais como backup de dados dos usuários, incluir novos usuários...
O cron limita a busca nos diretórios /bin e /usr/bin, portanto indique o caminho completo do programa ou script, ou melhor indique sempre, mesmo que estejam nestes diretórios.
veja mais sobre elaboração de scripts nos modelos e dicas em: http://www.zago.eti.br/script/A-menu-scripts.html
Exemplo com fetchmail, executar a cada 5 minutos.
A agendador de tarefas (cron, crond) executa os comandos com os direitos e permissões do usuário que fez a entrada dos dados, como o fetchmail tem que ser executado como root, então o usuário root deve fazer este agendamento, em um terminal como root, execute:
crontab -e
este comando vai abrir o editor "vi", quando fizer a primeira entrada o arquivo está vazio, basta pressionar a tecla INSERT para entrar em modo edição e digitar a linha abaixo:
*/5 * * * * /usr/bin/fetchmail -a
depois pressione a tecla ESCAPE, depois a tecla SHIFT+: e depois wq pra gravar e sair :wq
OBS.
/5 como no exemplo acima indica o intervalo de execução, repetição do comando, /5 executa o comando ou script a cada 5 minutos, sem a "/" executara aos 5 minutos de cada hora, ou seja desta forma:
* 5 * * * * /usr/bin/fetchmail -a
executará uma única vez por hora aos 5 minutos de cada hora.
Alguns comandos úteis:
crontab -l
Lista as tarefas agendadas
crontab -e
Editar o agendador de tarefas, incluir, alterar ou remover entradas.
Evite colocar somente o nome do programa ou script, no exemplo acima foi colocado somente fetchmail, mas o correto é acrescentar o caminho completo, utilize o whereis pra localizar o aplicativo, por exemplo:
whereis fetchmail
fetchmail: /usr/bin/fetchmail /usr/share/man/man1/fetchmail.1.gz
Neste caso a entrada no cron deveria ser assim:
*/5 * * * * /usr/bin/fetchmail -a
Quando não usa o caminho completo pra indicar onde está o aplicativo ou script, em algumas situações pode falhar e outras pode funcionar, evite usar configurações como esta.
*/5 * * * * fetchmail -a
Exemplo de como agendar para executar um script todos os dias às 22:10, neste exemplo foi utilizado o SARG - gerador de relatorios do Squid.
O script:
[root@faqcl9 root]# cat /etc/cron.daily/sargrelat #!/bin/bash /usr/sbin/sarg -f /etc/sarg/sarg.conf -p cp /var/log/squid/access.log /var/log/squid/copia`date +%d%m%y`access.log echo "" > /var/log/squid/access.log #poweroff
Este script gera o relatorio, faz uma copia do log pra um arquivo com outro nome incluindo no nome do arquivo a data da copia, limpa o arquivo de log original e por ultimo desliga o micro (poweroff) quando descomentada a ultima linha.
Este script está no diretório /etc/cron.daily com o nome de sargrelat
cd /etc/cron.daily vi sargrelat (pressione a tecla INSERT, copie e cole ou digite o script) #!/bin/bash /usr/sbin/sarg -f /etc/sarg/sarg.conf -p cp /var/log/squid/access.log /var/log/squid/copia`date +%d%m%y`access.log echo "" > /var/log/squid/access.log #poweroff
(salvar e sair, pressione a tecla ESCAPE, SHIFT:, wq )
torne o script executável:
chmod 755 sargrelat
Prontinho, agora é só aguardar o horario programado. Os scripts deste diretório, no CL9 E CL10 por default vem assim:
cat /etc/crontab # /etc/crontab: system-wide crontab ---corta-- 02 4 * * * root run-parts /etc/cron.daily
Mantendo a configuração original o script será gerado todos os dias às 4:02, prefiro executar no próprio dia para manter a data do relatório com a mesma que foram gerados os logs, tem meios de ajustar isto, achei mais prático alterar a data no crontab para executar as 22:10, use seu editor preferido ou "vi" para editar o /etc/crontab e ajuste o horario, para o meu exemplo 22:10 ficou assim.
cat /etc/crontab # /etc/crontab: system-wide crontab ---corta-- 10 22 * * * root run-parts /etc/cron.daily
Prontinho, gera automaticamente os relatorios diarios, claro que precisa manter o micro ligado para executar a tarefa. Com o micro desligado no horario programado o agendamento do dia é perdido, nova verficação vai ocorrer somente no horario do dia seguinte.
Caso queira executar alguma tarefa quando ligar o micro, use os script de inicialização, tem dicas e exemplos no FAQ iniciar.txt
script em /etc/cron.hourly são executados de hora em hora, podemos incluir rotinas com if para pular ou selecionar determinadas horas, executar comandos diferentes conforme a hora, como exemplo, rotina para iniiciar um processo as 18 horas e matar o mesmo as 08 horas.
#!/bin/bash /sbin/pidof FAH504-Linux.exe STATUSFAH="$?" HATUAL=$(date +%H) if [ "$HATUAL" -eq "20" ]; then # iniciar processo se status for diferente de zero (ainda não está rodando) if [ "$STATUSFAH" != "0" ]; then cd /home/zago/tmp ./FAH504-Linux.exe & fi fi # sair sem matar o processo aos sabados ou domingos MNUMDIA=$(echo `date +%u`) if [ "$MNUMDIA" = "6" ]; then exit 1 fi if [ "$MNUMDIA" = "7" ]; then exit 1 fi if [ "$HATUAL" -eq "08" ]; then # matar processo se status for igual a zero (rodando) if [ "$STATUSFAH" = "0" ]; then /usr/bin/pkill FAH504-Linux.exe killall -9 FAH504-Linux.exe kill -9 $(ps ax|grep "FAH504"|awk '{print $1}') fi fi
Páginas do manual (man, help) execute na linha de comando.
man crontab man 1 crontab man 5 crontab man 8 cron
Outros FAQ relacionados a datas, boot e agendamento de tarefas (crontab).