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.