cron과 함께 알림 보내기 사용


32

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사용하기에 더 친숙한 다른 알림 시스템이 있습니까?


이것은 내가 볼 수있는 한 작동해야합니다. &>>/tmp/crontest알림 전송 라인 에 a 를 추가하고 notify-send오류 메시지가 표시되는지 확인하십시오 .
Graeme

호기심으로 내 솔루션을 사용해 보셨습니까? 훨씬 간단하고 데비안에서 완벽하게 작동했습니다. 데비안 전용인지 아닌지를 알고 싶습니다
terdon

@ terdon 나는 당신의 해결책을 시험해 보았고 (단순한 테스트) 내 데비안 시스템에서 작동하는 것 같습니다. 실제로 더 간단하기 때문에 일반적으로 적용 가능한지 알고 싶습니다.
Marco

@Marco 저는 LMDE (필수 데비안 테스트)를 사용하고 있으며 Cinnamon을 DE로 사용하고 있습니다. 그 이상으로 작동하는지 말할 수 없습니다.
terdon

@Marco & terdon : 우분투 사람들은 그렇게 할 수 있습니다 : ubuntuforums.org/showthread.php?t=1727148
justsomeone

답변:


29

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

다음은 동일한 메커니즘을 사용하는 답변입니다.


1
내가 거의 해결책에 가깝다는 것을 알게되어 기쁩니다. 고마워 마르코, 그것은 깔끔하다!
justsomeone

좋아요, 나는 당신의 답변을 재사용하고 여기에 더 자세한 지침을 추가했습니다 : askubuntu.com/a/537721/34298
rubo77

이것이 보안 상 위험하지 않습니까? security.stackexchange.com/questions/71019/…
rubo77


우분투 15.10에서 DBUS를 포함하지 않는 다른 많은 답변을 시도했지만 아무것도 효과가 없었습니다. 그것은 간단하고 완벽하게 작동합니다.
bastian

16

crontab 자체에서 변수를 설정해야합니다.

DISPLAY=:0.0
XAUTHORITY=/home/matrix/.Xauthority

# m h  dom mon dow   command 
* * * * *  /usr/bin/notify-send "hello"

아니 sudo적어도 나의 시스템에서 필요하지 않습니다.


시간 내 주셔서 감사합니다. 이것은 간단한 해결책 인 것 같습니다. 불행히도, 이것은 저에게 효과가 없었습니다.
단지 누군가

@justsomeone 허, 그럼 데스크톱 환경에 따라 다를 수 있습니다.
테르 돈

나는 이것이 배포판이나 데스크탑 환경과 관련이 있다고 생각합니다. 우분투 사용자의 경우 직접 솔루션은 온라인 포럼에서 본 것에서 잘 작동하는 것 같습니다.
justsomeone

@justsomeone Cinnamon을 DE로 사용하는 데비안 (LMDE)에 있습니다. X가 시작되는 방법이나 DE가 사용하는 알림 시스템 인 dunno와 관련이있을 수 있습니다.
테르 돈

우분투 14.04 / 14.10에서 작동하는지 확인했습니다. 그놈과 유니티
Jordon Bedwell

8

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"

who_line명령 에는 tty가 인쇄되어 있지 않으므로 Trusty에서 작동하지 않습니다 . 출력은 다음과 같습니다 me :0 2015-09-23 10:40 ? 17234.
blujay 2016 년

1
@blujay가 업데이트되었습니다.
Graeme

고마워요. 그러나 별도의 답변으로 게시 한 것처럼 더 간단한 해결책이 있습니다.
blujay

@blujay 네, 이것은 휴대용 답변의 시도였습니다. 이것이 실제로 가능하지는 않지만 대부분의 경우 여전히 작동합니다.
Graeme

2

이 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 에서 해결책을 찾았습니다.


2

우분투 18.04에서 i3을 사용합니다. 이 문제를 해결하는 방법은 다음과 같습니다.

* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"


1

이것은 Ubuntu Trusty의 cronjob에서 알림 보내기 작업을 수행하기에 충분합니다.

#!/bin/bash
export DISPLAY=$(who -u | awk  '/\s:[0-9]\s/ {print $2}')

DISPLAYcronjob이 실행되는 사용자의 단순히 내보내기 만합니다. XAUTHORITY또는 설정하지 않고 나를 위해 작동합니다 DBUS_SESSION_BUS_ADDRESS.


1
우분투 16.04에서도 작동합니다. 나는 실제로 cron이 bash 스크립트를 시작하고 다른 펄 스크립트를 시작하는 bash 스크립트를 시작한다. bash 스크립트에 export 명령을 추가하면 해당 스크립트의 환경이 수정되었으며, 마지막 Perl 스크립트는 상속되어 시스템에서 사용할 수있게되었습니다 ( "notify-send ..."). Blujay를 찾아보세요!
Tim

1

Python 패키지를 설치하는 것이 편한 Linux 사용자를 위해 방금 전 하는 헤드리스 프로그램을 출시했습니다 . /proc필요한 사용자 이름 및 환경 변수를 검색 한 다음 notify-send이러한 변수와 함께 실행됩니다 ( sudo필요한 경우 필요한 사용자로 전환하는 데 사용됨).


1

스크립트를 만들 수도 있습니다.

#!/usr/bin/env bash
runuser -l [yourusername] -c 'DISPLAY=:0 notify-send "hey there user"'

그런 다음로 실행하십시오 sudo. 그러나 crontab -e생성 한 사용자로 모든 명령을 실행하므로 다음없이 호출하면 다음과 같이 충분합니다 sudo.

#!/usr/bin/env bash
DISPLAY=:0 notify-send "hey there user"

적어도 그것은 나를 위해 않습니다. 그것은 모두 환경 구성에 의존하는 것 같습니다.


0

나는 cron 에서이 스크립트를 사용하여 매시간마다 트위터에 MPD를 게시합니다.

#!/bin/bash
export DISPLAY=":0.0"
msg=$(mpc current -h 192.168.1.33)
twitter set "#MPD Server nowplaying $msg :  http://cirrus.turtil.net:9001"
#ttytter -status="#MPD Server nowplaying $msg. http://cirrus.turtil.net:9001"

exit 

통지 전송을 사용하는 유사한 스크립트

#!/bin/bash
export DISPLAY=":0.0"
notify-send -i ~/.icons/48arch.png 'OS- Archlinux x86_64 : DWM Window Manager' 'Installed on Sun Apr 21 2013 at 18:17:22' 
exit

KDE가 자체 알림 데몬 IIRC를 사용하므로 문제가 발생할 수 있습니다.


0

그 가치에 대해 ....

Debian Jessie에서 다음을 모두 사용 하여이 작업을 수행해야했습니다 ...

export DISPLAY=:0.0
export HOME=/home/$user
source "$HOME/.dbus/session-bus/*-0"

이 중 하나를 제거하면 작동이 중지되었습니다.


마지막 줄은 디렉토리에 문자 그대로 호출 *-0된 파일이 없기 때문에 여기에 작성된대로 아무것도하지 않습니다 session-bus. 당신은 의미했을 것 source "$HOME"/.dbus/session-bus/*-0입니다.
roaima

0

sudo 사용 :

sudo -u $currentxuser notify-send $message

팁 :

이 명령으로 현재 x 사용자를 얻을 수 있습니다

ps auxw | grep -i screen | grep -v grep | cut -f 1 -d ' '

게다가...

currentxuser=$(ps auxw | grep -i screen | grep -v grep | cut -f 1 -d ' ')
echo $currentxuser

알아 둘만 한 :

루트에서 실행되는 Cron은 x에 액세스 할 수 없으므로 모든 gui 명령이 표시되지 않습니다. 한 가지 간단한 해결책은이 명령으로 현재 x 사용자의 권한이 부여 된 x 사용자에게 루트를 추가하는 것입니다

x 사용자 쉘에서

xhost local:root

또는

sudo -u $currentxuser xhost local:root

-1

다음은 Graeme이 제공 한 것보다 덜 복잡한 스크립트입니다. 그의 대본은 나를 위해 작동하지 않았고 $who_line항상 비어있었습니다. 내 스크립트는 프로세스를 찾는 데 많은 시간을 소비하지 않습니다. 대신, 모든 것을 시도하고 마지막으로 찾은 유용한 값을 선택합니다. 나는 xubuntu 14.04를 실행 중이며 아마도 이런 종류의 스크립트를 혼동하는 lxc 컨테이너가 실행 중입니다.

env="$(
  ps -C init -o uid,pid | while read u p; do
    [ "$u" = "`id -u`" ] || continue
    grep -az '^DBUS_SESSION_BUS_ADDRESS=' /proc/$p/environ | xargs -0
  done | tail -1
)"

export "$env"

notify-send "test"

Xorg 프로세스의 환경에는이 없기 때문에 Trusty에서 작동하지 않습니다 DBUS_SESSION_BUS_ADDRESS. 쉘에서 얻을 수 있지만 Xorg 프로세스에서는 얻을 수 없습니다.
blujay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.