Como atualizar o crontab para um usuário não root no Solaris de forma não interativa?

1

Eu gostaria de atualizar as entradas do crontab para um usuário não-root para um aplicativo que é instalado como o pacote OpenPKG RPM.

Atualmente, tenho isso na seção %post do meu arquivo .spec:

#
# Set up the 'app' user's crontab.
# Marker lines are used to separate content from different packages:
#     #Begin of App package
#     # ...
#     #End of App package
# Replace any possibly existing content between these lines and insert the
# content of the installed new file
CRONTAB=/var/spool/cron/crontabs/%{V_user}
if [ -f $CRONTAB ]; then
    begin='head -1 %{V_instdir}/etc/crontab'
    end='tail -1 %{V_instdir}/etc/crontab'
    if [ -z "$begin" ] || [ -z "$end" ]; then
        echo "Error: Start or end delimiter line is empty. Check '%{V_instdir}/etc/crontab'"
        exit 1
    fi
    sed -e "/^$begin/,/^$end/d" $CRONTAB > $CRONTAB.tmp
    cat %{V_instdir}/etc/crontab >> $CRONTAB.tmp
    mv $CRONTAB.tmp $CRONTAB
else
    cp %{V_instdir}/etc/crontab $CRONTAB
fi
chown root:sys $CRONTAB
chmod 600 $CRONTAB

Isso não funciona: o arquivo é criado corretamente, mas cron não seleciona as alterações. Suponho que não seja permitido editar o arquivo em /var/spool/cron diretamente.

Qual é o caminho certo para editar o crontab?

  • A página crontab man não menciona uma maneira de carregar um crontab para um usuário de um arquivo. Não aceita um da entrada padrão.
  • Posso sinalizar o daemon cron para reler os arquivos crontab?
  • Ou devo usar su , nos moldes de

    su %{V_user} -c "crontab -l > $tmpfile"
    # Make the changes
    su %{V_user} -c "crontab $tmpfile"
    

    Isso não falharia se o usuário de destino não tivesse permissão para editar seu próprio arquivo crontab?

O sistema operacional é o Solaris 10. Não tenho acesso root. Alguém mais precisa instalar o pacote RPM que eu criei.

    
por hfs 30.07.2012 / 10:25

1 resposta

4

Infelizmente, o cron (1M) não aceita sinais para reler crontabs. A maneira como a ferramenta crontab (1) se comunica com o cron é através da comunicação entre processos (veja o source ). Dito isto, parece que o crontab é provavelmente a melhor ferramenta que você poderia usar para modificar o crontab de um usuário. Você pode escrever um script que adicione / exclua / modifique o crontab e use-o da seguinte maneira:

EDITOR=<your script> crontab -e <user>

O script recebe um argumento, um nome do arquivo que contém uma cópia do crontab desse usuário, processa o arquivo e sai com o código de retorno 0. crontab então indicará ao cron que o crontab do usuário foi alterado. No caso de você acabar com um crontab vazio, você tem que mudar estratégias e usar

crontab -r <user>

em vez disso. Um pouco chato.

A outra possibilidade seria apenas reiniciar o cron após sua modificação com

svcadm restart cron

mas isso requer su ou pelo menos o direito solaris.smf.manage.cron.

    
por 30.07.2012 / 18:08