Arch에 'cron` 작업과 mailto 오류 설정


0

나는 사용한다 postfix 에 대한 상용 SMTP 서버에 연결 cron 오류 / 경고 발생시 전자 우편을 소유자에게 보냅니다. 이것은 하나의 박스 아치 설정입니다.

postfix 공장. 그렇다. cronie. 하지만 모든 cron 작업 중 가장 간단한 작업이 시작되지만 모든 실행시 cron 데몬으로부터 전자 메일이 전송됩니다.

/ bin / sh : 경고 : 명령 대체 : 입력에서 null 바이트가 무시되었습니다.

매 분마다 테스트로 실행되는 cron 규칙은 다음과 같습니다.

MAILTO=MYUSERNAME@LOCALHOSTNAME

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

실행 파일 ~ / test는 기본적으로 다음과 같습니다.

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

나는 이해 grep -Ez [...] 는 비정상적인 문자가있는 출력에 필요한대로 null 바이트를 도입합니다.

모든 장난감을 실행할 때마다 특정 경고가 USERNAME에게 이메일로 전송되지 않으면 내 장난감 예제가 제대로 작동합니다. 어떻게 그걸 없애 죠?

답변:


1

바꾸다 \0\n:

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!'

좋은 아이디어 IporSircer하지만 심지어 "icewm"을 "gnome-session"과 같은 것으로 대체하는 것은 출력물을 광산과 매우 가깝지만 "D"문자로 시작합니다. 내 게시 된 솔루션을 선호하는 경향이 있기 때문에 귀하의 pipe, 그렇다고 큰 문제는 아닙니다.
Cbhihe

업데이트 된 실수였습니다.
Ipor Sircer

.... "-x"....?
Cbhihe

1

약간 연구 후에 .... 그것은 grep -Ez [...] cron 작업에서이 작업을 수행하는 올바른 방법이 아닙니다.

/proc/[pid]/environ 리눅스 OS에서는 null 바이트가 레코드 분리 자라는 단점을 가지고있어서 stdout에 출력 할 때 내용이 한 줄, 즉 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^@

위의 경우, 나는 cat 와 더불어 -v null 바이트를 나타내는 플래그.

따라서 해결책은 패턴을 찾는 것입니다. "DBUS_SESSION_BUS_ADDRESS" null 바이트를 인식합니다. awkgawk 둘 다 그렇지만 휴대용 레코드 분리자를 nul 바이트의 16 진수 코드로 변경하여 다음을 수행하십시오. \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

이것은 실제로 nul 바이트가없는 깨끗한 출력을 생성하며 cron. 경고가 생성되지 않고 전자 메일이 전송되지 않습니다.


1
시스템이 / tmp에있는 임의의 세션 버스 주소가 아닌 /에서 "사용자 버스"스타일을 사용하기 때문에이 전체 greppage는 이제 선택 사항이며 버스 주소를 안전하게 하드 코드 할 수 있습니다. (또는 환경 변수가 없을 때 이미 기본값으로 코딩 된 최근의 libdbus에 의존하십시오.)
grawity

@ grawity : 나는 그것을 절대 몰랐다. 그 효과에 대한 간단한 답을 쓰시겠습니까? 다른 사람들이 실제로 귀하의 의견을 놓치지 않도록하십시오. 그냥 리눅스 시스템에서 이식성을 찾고 있다는 것을 명심해라. 나의 대답은 꽤 쉽지 않다. Tx.
Cbhihe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.