Configure o trabalho 'cron' e mailto no erro, no Arch

0

Eu uso postfix vinculado a um servidor comercial SMTP para cron jobs para enviar um e-mail aos proprietários em caso de erro / aviso. Esta é uma configuração do Arch de uma caixa.

postfix funciona. O mesmo acontece com cronie . Mas, embora o mais simples de todos os trabalhos do cron seja acionado, recebo um e-mail do daemon do cron a cada execução, que diz:

/bin/sh: warning: command substitution: ignored null byte in input.

A regra do cron, a ser executada a cada minuto como teste, é:

MAILTO=MYUSERNAME@LOCALHOSTNAME

* * * * * eval "export $(grep -Ez DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";/home/USERNAME/test

e o executável ~ / test é basicamente:

#!/bin/bash
/usr/bin/notify-send 'Hello world!' --icon=dialog-information

Eu entendo que grep -Ez [...] introduz um byte nulo, como é necessário por sua saída com alguns caracteres incomuns.

Meu exemplo de brinquedo funcionaria corretamente se não fosse esse aviso específico enviado por e-mail para USERNAME a cada execução. Como me livrar disso?

    
por Cbhihe 12.10.2018 / 21:24

2 respostas

1

Depois de algumas pesquisas ... Acontece que grep -Ez [...] não é o jeito certo de fazer isso em um cron job.

/proc/[pid]/environ no Linux OS tem o capricho de que o byte nulo é o separador de registro, de modo que seu conteúdo quando enviado para stdout "parece" uma única linha, ou seja, sem caractere EOL:

$ cat -v /proc/$(pgrep -u $LOGNAME gnome-session)/environ
LC_MEASUREMENT=en_IE.UTF-8^@LC_PAPER=en_IE.UTF-8^@LC_MONETARY=en_IE.UTF-8^@LANG=en_US.UTF-8^@GDM_LANG=en_US.UTF-8^@DISPLAY=:1^@USERNAME=USERNAME^@MOZ_PLUGIN_PATH=/usr/lib/mozilla/plugins^@XDG_VTNR=2^@XDG_SESSION_ID=2^@USER=USERNAME^@DESKTOP_SESSION=gnome^@PWD=/home/USERNAME^@HOME=/home/USERNAME^@XDG_SESSION_TYPE=x11^@XDG_SESSION_DESKTOP=gnome^@LC_NUMERIC=en_IE.UTF-8^@MAIL=/var/spool/mail/USERNAME^@WINDOWPATH=2^@SHELL=/bin/bash^@XDG_CURRENT_DESKTOP=GNOME^@XDG_SEAT=seat0^@SHLVL=0^@GDMSESSION=gnome^@LOGNAME=USERNAME^@DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus^@XDG_RUNTIME_DIR=/run/user/1000^@XAUTHORITY=/run/user/1000/gdm/Xauthority^@PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl^@LC_TIME=en_IE.UTF-8^@

Acima, usei cat com o sinal -v para revelar bytes nulos.

Portanto, a solução é procurar o padrão "DBUS_SESSION_BUS_ADDRESS" , reconhecendo bytes nulos. awk e gawk fazem isso, embora seja não portátil , alterando o separador de registro para o código hexadecimal do byte nul: \x00

$ awk -F 'BEGIN {RS="\x00"} /DBUS_SESSION_BUS_ADDRESS/' /proc/$(pgrep -u $LOGNAME gnome-session)/environ
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus

Isso realmente produz uma saída limpa sem bytes nulos e é muito apreciado por cron . Nenhum aviso é produzido e nenhum email é enviado.

    
por 12.10.2018 / 21:42
1

Substitua \n por %code% :

eval "export $(tr -s \0 \n </proc/$(pgrep -u $LOGNAME -x gnome-session)/environ|grep DBUS_SESSION_BUS_ADDRESS)";/usr/bin/notify-send 'Hello world!'
    
por 12.10.2018 / 21:38