왜 직장에서 dzen2를 통해 전화하지 않습니까?

왜 직장에서 dzen2를 통해 전화하지 않습니까?

dzen2알림 유틸리티입니다. 이 명령은 화면에 "안녕하세요" 알림을 표시합니다.

echo Hi | dzen2 -p

데비안존재하다미래의 이벤트를 예약하는 유틸리티입니다. 이 명령은 1분 후에 사용자 디렉터리에 "foo" 파일을 표시합니다.

echo "touch ~/foo" | at now + 1 minute

그렇다면 dzen2이 명령에 대해 1분 후에 알림이 표시되지 않는 이유는 무엇입니까?

echo "echo Hi | dzen2 -p" | at now + 1 minute

몇 시간 동안 조사해 보았는데 이것이 작동하지 않는 이유를 찾을 수 없는 것 같습니다! 나는 그것이 호출되는 쉘과 관련이 있다고 직감하지만 왜 실패하는지 이해하지 못합니다. 대위법의 예로 다음 명령은 잘 작동합니다.

echo "notify-send Hi" | at now + 1 minute

답변1

이 작업을 구성하는 프로그램은 다음 위치에 at있습니다 .atd악마) 프로세스, 실행 중인 셸의 프로세스가 아닙니다 at. 따라서 현재 쉘의 환경을 상속받지 않습니다. 시스템은 at환경(작업 디렉터리 및 좀 더 모호한 항목 포함)을 복사하도록 준비하지만 일부 변수를 생략합니다.

특히 이 DISPLAY변수는 at 작업에 복사되지 않습니다. 이 변수는 모든 X 프로그램에 연결할 모니터를 알려줍니다. X가 표시되지 않으면 dzen2는 알림 팝업 위치를 알 수 없습니다. At DISPLAY는 일반적으로 터미널이나 그래픽 출력을 생성하지 않는 일괄 작업에 사용되므로 제거됩니다 .

notify-sendX 서버에 연결되어 있지 않기 때문에 작동합니다.D 버스X 세션에 연결된 데몬에 연결합니다.

변수를 명시적으로 복사하여 dzen2가 작동하도록 할 수 있습니다 DISPLAY.

echo "export DISPLAY=$DISPLAY;" 'echo hello | dzen2 -p' | at now + 42 minutes

dzen2에서는 오류 메시지가 나타날 수 있습니다(표준 메시지는 입니다 Can't open display:). at 작업에서 생성된 모든 출력 또는 오류 메시지는 로컬 메일을 통해 전송됩니다(정확히 cron 작업과 유사). 지역 메일을 확인하세요.

관련 정보