kdialog未从cron运行的bash脚本

kdialog未从cron运行的bash脚本,bash,cron,Bash,Cron,我试图从cron运行bash脚本,但似乎没有任何效果 脚本: #!/bin/sh printf '%s' $(date) '_END' >> battery_log.txt export DISPLAY=:0 kdialog --msgbox "$(upower -i /org/freedesktop/UPower/devices/battery_BAT0| grep -E "state|to\ full|percentage")" crontab(如sudo): 我已检查以确保:

我试图从cron运行bash脚本,但似乎没有任何效果

脚本:

#!/bin/sh
printf '%s' $(date) '_END' >> battery_log.txt
export DISPLAY=:0
kdialog --msgbox "$(upower -i /org/freedesktop/UPower/devices/battery_BAT0| grep -E "state|to\ full|percentage")"
crontab(如sudo):

我已检查以确保:

the script is executable
root user owns the script
I can run the script from within a shell using ./my_battery_script
I can run other bash scripts from within cron (I created a test script that wrote to a text file). Worked fine
kdelibs-full is installed
为什么这个脚本不能运行

编辑:更多详细信息

  • 在Linux Mint 17.3上运行

  • 内核:3.19.0-32-generic

  • 我期望发生的事情:当cron中的计时器启动时,它将启动脚本(作为root)。该脚本基于display变量(或者我在其他论坛上读到的)使用自己的display(不确定术语)来显示电池信息


    脚本实际执行的日志如下所示:

    ++ date 
    + printf %s Mon Jan 11 22:29:01 EST 2016 _END 
    MonJan1122:29:01EST2016_END+ export DISPLAY=:0 
    + DISPLAY=:0 
    ++ upower -i /org/freedesktop/UPower/devices/battery_BAT0 
    ++ grep -E 'state|to\ full|percentage' 
    ++ cat /sys/class/thermal/thermal_zone0/temp 
    ++ awk '{print "deg C: "$1/1000}' 
    + /usr/bin/kdialog --msgbox ' state: discharging 
    percentage: 58% \n cpu temp: deg C: 44.5' 
    No protocol specified 
    kdialog: cannot connect to X server :0
    

    尝试在脚本中添加kdialog的路径,似乎找不到命令

    假设您实际有一台X服务器在为显示器0运行,这通常意味着您有一个操作系统级别的安全措施,防止root用户访问该显示器


    这里的简单答案是在您的用户帐户下运行此cron作业,而不是以root用户身份运行。

    为什么要使用
    #/bin/sh
    当您可以使用时/bin/bash?我不认为这能解决你的问题,但是你用的是什么操作系统?较旧的Unixn可能不支持crontab中的
    PATH=…
    ,但如果您使用的是Linux,这应该不是问题。为什么不将完整路径添加到
    kdialog
    。这不是一个使用窗口程序的交互式程序吗?对于一个不是从用户会话启动的程序,您希望发生什么?您认为
    root
    将接管谁的会话来显示该输出?我没有你的环境,所以我无法进一步帮助你。祝你好运(编辑您的Q w更多详细信息)。显示对于现代X系统来说是不够的——您还需要身份验证(Xauthority)。将脚本的stderr重定向到日志文件,并将其内容包含在您的问题中。也就是说:
    exec2>/path/to/file.log
    作为第二行左右。您还可以
    exec 2>>battery_log.txt
    ,然后您回显或打印的任何内容
    &2
    都将转到那里,而无需为单个命令重新打开文件。(…正如Shelter所说,让shebang和手动shell调用不一致是一种不好的做法;对这两个脚本使用相同的shell--
    bash
    /bin/sh
    不是同一个shell--否则脚本的行为可能会因启动方式的不同而有所不同)。我应该将该行放在哪个文件中?crontab,还是可以从脚本本身重定向输出?如何找到kdialog安装位置的路径?@Rilcon42,
    键入kdialog
    。(还有一个较旧的外部命令
    ,它
    ,但是
    type
    更准确地显示了shell的实际功能,即使涉及别名/函数等)。找到kdialog或find.-name“kdialog”@levbytriskiy,如果OP可以在其X会话(cron外部)内运行该命令,则几乎不需要它成功——在这种情况下,我们已经知道它在他们的用户帐户路径中,因此他们可以在会话中交互式地使用
    type
    which
    ++ date 
    + printf %s Mon Jan 11 22:29:01 EST 2016 _END 
    MonJan1122:29:01EST2016_END+ export DISPLAY=:0 
    + DISPLAY=:0 
    ++ upower -i /org/freedesktop/UPower/devices/battery_BAT0 
    ++ grep -E 'state|to\ full|percentage' 
    ++ cat /sys/class/thermal/thermal_zone0/temp 
    ++ awk '{print "deg C: "$1/1000}' 
    + /usr/bin/kdialog --msgbox ' state: discharging 
    percentage: 58% \n cpu temp: deg C: 44.5' 
    No protocol specified 
    kdialog: cannot connect to X server :0
    
    + /usr/bin/kdialog --msgbox ' state: discharging 
    percentage: 58% \n cpu temp: deg C: 44.5' 
    No protocol specified 
    kdialog: cannot connect to X server :0