kdialog未从cron运行的bash脚本
我试图从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): 我已检查以确保:
#!/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
为什么这个脚本不能运行
编辑:更多详细信息
脚本实际执行的日志如下所示:
++ 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