KDE / Awesome WM과 함께 Arch Linux를 사용하고 있습니다. notify-send
작업을 시도
하고 cron
있습니다.
나는 DISPLAY
/ XAUTHORITY
변수를 설정 하고 notify-send
결과없이 “sudo -u”로 실행 하려고 시도했습니다 .
세션에서 대화식으로 알림 보내기를 호출하고 알림을받을 수 있습니다.
FRON은 크론 작업이 정상적으로 실행 중이며 임시 파일에 물건을 에코하여 확인했습니다. 작동하지 않는 것은 단지 “알림-송신”입니다.
암호:
[matrix@morpheus ~]$ crontab -l
* * * * * /home/matrix/scripts/notify.sh
[matrix@morpheus ~]$ cat /home/matrix/scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
echo "testing cron" >/tmp/crontest
sudo -u matrix /usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest
[matrix@morpheus ~]$ cat /tmp/crontest
testing cron
now tested notify-send
[matrix@morpheus ~]$
알 수 있듯이 알림 보내기 전과 후에 에코가 작동했습니다.
또한 설정을 시도했습니다DISPLAY=:0.0
업데이트 : 조금 더 검색하여 DBUS_SESSION_BUS_ADDRESS 를 설정해야 한다는 것을 알았습니다 . 대화식 세션에서 얻은 값을 사용하여 이것을 하드 코딩 한 후 작은 “hello”메시지가 1 분마다 화면에 나타납니다!
그러나 catch는이 변수가 해당 게시물마다 영구적이지 않기 때문에 여기서 제안 된 명명 된 파이프 솔루션을 시도해 보겠습니다.
[matrix@morpheus ~]$ cat scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-BouFPQKgqg,guid=64b483d7678f2196e780849752e67d3c
echo "testing cron" >/tmp/crontest
/usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest
cron
통지 전송을 지원하지 않는 것 같으 므로 (적어도 직접적으로는 아님) cron
사용하기에 더 친숙한 다른 알림 시스템이 있습니까?
답변
DBUS_SESSION_BUS_ADDRESS
변수 를 설정해야 합니다. 기본적으로 cron은 변수에 액세스 할 수 없습니다. 이 넣어에게 다음 스크립트 어딘가를 해결하고 예를 들어 사용자가 로그인을 사용할 때 호출하는 멋진 과 run_once
위키에 언급 한 기능을. 함수가 필요한 것보다 자주 호출되는 경우 해를 끼치 지 않기 때문에 모든 메소드가 수행합니다.
#!/bin/sh
touch $HOME/.dbus/Xdbus
chmod 600 $HOME/.dbus/Xdbus
env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.dbus/Xdbus
echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.dbus/Xdbus
exit 0
필요한 Dbus 환경 변수가 포함 된 파일이 생성됩니다. 그런 다음 cron이 호출 한 스크립트에서 스크립트를 소싱하여 변수를 가져옵니다.
if [ -r "$HOME/.dbus/Xdbus" ]; then
. "$HOME/.dbus/Xdbus"
fi
답변
crontab 자체에서 변수를 설정해야합니다.
DISPLAY=:0.0
XAUTHORITY=/home/matrix/.Xauthority
# m h dom mon dow command
* * * * * /usr/bin/notify-send "hello"
아니 sudo
적어도 나의 시스템에서 필요하지 않습니다.
답변
X 세션 관련 환경 변수를 얻는 가장 안전한 방법은 X에 로그온 한 사용자 프로세스 환경에서 변수를 가져 오는 것입니다. 다음은 정확히 동일한 목적으로 사용하는 스크립트를 수정 한 것입니다 (DBUS_SESSION_BUS_ADDRESS는 ‘ t 데비안에서 문제가되는 것 같습니다) :
X=Xorg # works for the given X command
copy_envs="DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS"
tty=$(ps h -o tty -C $X | head -1)
[ -z "$tty" ] && exit 1
# calling who with LANG empty ensures a consistent date format
who_line=$(LANG= who -u | grep "^[^ ]\+[ ]\+$tty")
x_user=$(echo $who_line | cut -d ' ' -f 1) # the user associated with the tty
pid=$(echo $who_line | cut -d ' ' -f 7) # the user's logon process
for env_name in $copy_envs
do
# if the variable is not set in the process environment, ensure it does not remain exported here
unset "$env_name"
# use the same line as is in the environ file to export the variable
export "$(grep -az "^$env_name=" /proc/$pid/environ)" >/dev/null
done
sudo -u "$x_user" notify-send "hello"
루프를 추가하여 모든 사용자에게 보낼 수는 있지만 찾은 첫 번째 X 사용자에게 메시지를 보냅니다.
최신 정보
utmp 형식으로 업데이트하면 who
두 번째 열에 tty 대신 디스플레이가 인쇄되는 것으로 보입니다 . 이것은 실제로 일을 더 쉽게 만들어줍니다. 이전에 주석의 표시 만 인쇄했으며 원래의 대답에 의존하는 것이 안전하지 않다고 결정했습니다. 이 경우 다음을 시도하십시오.
X=Xorg # works for the given X command
copy_envs="DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS"
# calling who with LANG empty ensures a consistent date format
who_line=$(LANG= who -u | awk '$2 ~ ":[0-9]"')
x_user=$(echo $who_line | cut -d ' ' -f 1) # the user associated with the tty
pid=$(echo $who_line | cut -d ' ' -f 7) # the user's logon process
for env_name in $copy_envs
do
# if the variable is not set in the process environment, ensure it does not remain exported here
unset "$env_name"
# use the same line as is in the environ file to export the variable
export "$(grep -az "^$env_name=" /proc/$pid/environ)" >/dev/null
done
sudo -u "$x_user" notify-send "hello"
답변
이 one-liner는 Croja와 함께 Manjaro에서 나를 위해 일했습니다.
# Note: "1000" would be your user id, the output of... "id -u <username>"
10 * * * * pj DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send 'Hello world!' 'This is an example notification.'
매우 추악한 DBUS_blah_blah가 없으면 전혀 작동하지 않습니다. 나도 찾았 어journalctl -xb -u cronie
도움이되었습니다. 아직 Cronie에 익숙하지는 않지만 “crontab”을 만들었으며 /etc/cron.d/mycronjobs
해당 파일 이름이 필요한지 또는 cron.d 디렉토리의 모든 내용을 읽는지 확실하지 않습니다.
https://wiki.archlinux.org/index.php/Desktop_notifications 에서 해결책을 찾았습니다.
답변
우분투 18.04에서 i3을 사용합니다. 이 문제를 해결하는 방법은 다음과 같습니다.
* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"
답변
이것은 Ubuntu Trusty의 cronjob에서 알림 보내기 작업을 수행하기에 충분합니다.
#!/bin/bash
export DISPLAY=$(who -u | awk '/\s:[0-9]\s/ {print $2}')
DISPLAY
cronjob이 실행되는 사용자의 단순히 내보내기 만합니다. XAUTHORITY
또는 설정하지 않고 나를 위해 작동합니다 DBUS_SESSION_BUS_ADDRESS
.