Eu tenho um script de instalador/atualizador destinado a IRIX/Linux/macOS/FreeBSD e gostaria de estender sua compatibilidade para Solaris.
Já consertei algumas partes que não eram compatíveis com POSIX, exceto a crontab
que é gerada assim:
printf '%s\n' [email protected] '*/15 * * * * /path/cmd' | crontab -
# crontab -l # (on Linux/macOS/FreeBSD)
[email protected]
*/15 * * * * /path/cmd
nota: /path/cmd
é silencioso a menos que detecte um problema
O código falha no Solaris por três motivos:
MAILTO=
lança um erro de sintaxe*/15
lança um erro de sintaxecrontab -
tenta abrir o arquivo chamado-
Eu consertei o nº 2 e o nº 3 com:
printf '%s\n' '0,15,30,45 * * * * /path/cmd' | crontab
# crontab -l
0,15,30,45 * * * * /path/cmd
Agora eu não sei como converter a MAILTO=
parte. Qual seria uma maneira POSIX de encaminhar e-mails de um crontab
?
Solução alternativa selecionada:
Graças aos ponteiros @ilkkachu e @Gilles'SO-stopbeingevil' , aqui está como decidi emular o comportamento do crontab de MAILTO
uma maneira compatível com POSIX:
# crontab -l
0,15,30,45 * * * * out=$(/path/cmd 2>&1); [ -n "$out" ] && printf \%s\\n "$out" | mailx -s "Cron <$LOGNAME@$(uname -n)>" [email protected]
Mas, há um problema potencial com esta solução: se nãoprintf
for um shell embutido e a saída for muito grande, ela falhará com um ou semelhantes.Argument list too long
Observe que
MAILTO
não é bom para um instalador de software, mesmo onde ele é suportado, porque é uma configuração global: ela se aplicaria a todas as entradas no crontab, não apenas àquela adicionada pelo seu software.Se você deseja que seu software envie e-mails para um endereço diferente, você precisa lidar com isso em seu próprio código. E isso significa que você precisa lidar com a lógica do status de saída e da saída vazia.
Aqui está um código não testado que implementa essa lógica. Substitua as novas linhas por espaços (ou apenas remova-as) para colocá-las em uma única linha no arquivo crontab.
Este código usa apenas recursos POSIX mais os amplamente disponíveis
mktemp
. Infelizmente, não está disponível no IRIX. Se o IRIX tiver um m4 compatível com POSIX, você poderá usá-lo para implementar omktemp
. Como alternativa, você pode armazenar um arquivo temporário em algum lugar no diretório inicial do usuário ou em algum outro diretório onde apenas o outro possa gravar. Não crie um arquivo temporário com um nome previsível em um diretório compartilhado como/tmp
: isso é inseguro .