我有一个crontab设置为每晚在特定时间关闭我的电脑。它还会显示警告并允许取消该过程。
我的问题是,如果终端尚未打开,我无法向终端显示警告。我希望终端出现并显示警告并留下取消它的可能性。
我包含了我当前的cron命令。我究竟做错了什么?感谢。
0 3 * * * /sbin/shutdown -r 5 "Shutting down in five minutes..."
答案 0 :(得分:1)
wall
/ mesg
shutdown
使用的广播机制的工作原理 - 它与终端紧密相关,并且不了解图形环境
另一种方法是创建一个脚本,如果有可用的消息,则生成一个弹出窗口。这需要您在某处分配TTY(查看答案末尾的详细信息。)
另一方面,恕我直言更好,更简单,替代方案是完全抛弃shutdown
消息传递系统,并产生一个类似echo Shutting down in 5 minutes...; sleep 300; shutdown
的终端。这种方法的优点是你可以用 Ctrl + C 来取消它。缺点是,根据你如何产生终端,它需要X运行,并会产生一个可能烦人的弹出窗口。
话虽如此,我相信这个问题更适合SuperUser或Unix & Linux SE。
具体wall
,由shutdown
使用,只循环遍历系统中的所有可写TTY(例如/dev/pts/1
)并将字符串写入它们。例如:
sudo tail -f /dev/tty50
sudo wall test
将显示消息test
三次:终端B中的一次,终端A中的一次和终端A中的tail
中的一次,从TTY50读取(在此示例中,我们需要{{ 1}}将消息广播到我们不拥有的TTY。
由于桌面上没有打开控制台(=没有TTY),因此没有人可以看到来自sudo
的消息。因此,为了按照建议1阅读,您需要在某处保留自己的TTY。我相信文章Allocating Pseudo-Terminals解释了如何以低级方式执行此操作。实现它的另一种方法是监视已经分配的TTY,例如具有超级用户权限的TTY50,尽管我不建议这样做。