Cron

子程序退出導致 dbus-laauch 失敗

  • February 24, 2017

我想要一個 python 腳本來發送通知。該腳本可以成功執行並顯示我想要的內容。但是 crontab 沒有以正確的方式啟動它。

以下是參考libnotify的程式碼

def SendMessage(title, message):
   pynotify.init("ChinaBank")
   notice = pynotify.Notification(title,message)
   notice.show()
   return

我在 crontab 中所做的是

* * * * * display=`/home/li/script/FetchDisplay.sh` && export DISPLAY=$display && /home/li/projects/fetch-data/EuroForex.py 2>/home/li/error

在這裡,FetchDisplay.sh 是為了得到如下顯示:

#!/bin/bash 

if [ "$DISPLAY" != "" ]; then
       echo $DISPLAY
       exit
fi

if ["$USER" = "" ]; then
       USER=`whoami`
fi

pinky -fw | awk -v user=$USER 'NF == 6 {if($1 == user) {print $6}}' | awk 'NR==1{print $0}

錯誤輸出是

Traceback (most recent call last):
 File "/home/li/projects/fetch-data/EuroForex.py", line 43, in <module>
   SendMessage("Please be ready to sell", str(SellData))  
 File "/home/li/projects/fetch-data/EuroForex.py", line 15, in SendMessage
   notice.show()
glib.GError: Error spawning command line 'dbus-launch --autolaunch=970be6bbf9ff49009918057c308cf56e --binary-syntax --close-stderr': Child process exited with code 1

我知道DISPLAY是**:0**,通過命令

echo $DISPLAY

因此,我用它測試了 gnome-screensaver-command。

* * * * *  export DISPLAY=:0 && /usr/bin/gnome-screensaver-command --lock 2>/home/li/screenerror

不幸的是,它沒有用,輸出是

** Message: Failed to get session bus: Error spawning command line 'dbus-launch --autolaunch=970be6bbf9ff49009918057c308cf56e --binary-syntax --close-stderr': Child process exited with code 1

我以為是DISPLAY的問題,但是變數DISPLAY是正確的。你能告訴我發生了什麼嗎?

我從這裡找到答案。 使用 cron 在 Ubuntu 上更新 Pidgin IM 狀態

cron 在自己的環境中執行,因此,我們必須找到變數 DBUS_SESSION_BUS_ADDRESS、XAUTHORITY 和 DISPLAY。我按照說明成功設置了變數。

我的腳本現在可以執行了!

引用自:https://unix.stackexchange.com/questions/347237