태그 보관물: shell

shell

cron과 함께 알림 보내기 사용 cat /tmp/crontest testing

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}')

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


답변

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