【问题标题】:get userinput from bash script (executed by cron or udev)从 bash 脚本获取用户输入(由 cron 或 udev 执行)
【发布时间】:2012-12-19 16:36:15
【问题描述】:

编辑,这个问题可能还不是很清楚,简短的版本:

如果脚本在后台运行而不是在活动控制台中,如何弹出询问用户输入的对话框? /编辑

当我从 udev 或 cron 运行 bash 脚本时,它通常会在后台某处安静地运行。示例可能是插入外部硬盘驱动器运行 rsync 以进行数据备份。所以不是每次我插入硬盘时我都想启动这个动作。

启动某些用户输入对话框并询问是或否的最简单方法是什么?我可以用 PyQt 编写一些接口,但我希望尽可能少的依赖,最好是跨窗口管理器,甚至可能没有窗口管理器。

谢谢!

【问题讨论】:

  • 如果用户根本没有登录怎么办?
  • 假设用户已登录,我插入硬盘是因为我想与之交互(所以我已登录),现在我想启动一个脚本,询问我是/现在做你想运行备份 rsync
  • 如果有多个用户登录怎么办?你如何决定谁得到提示?一般来说,在cron/udev/...中请求用户交互并不是一个特别好的设计...虽然,KDE 和 Gnome 都有可以在某些硬件事件上弹出通知的小程序/小部件。也许研究如何定制这些是您所需要的......

标签: linux bash shell ubuntu console


【解决方案1】:

编辑 2:轻量级(因此和预期的一样丑)版本是 xmessage,这可能是问题的答案,除非你有更好的:

xmessage  "Do you want to run the backup script?" -buttons yes,no

http://linux.byexamples.com/archives/87/using-gui-dialog-box/

编辑:kde 有 KDialog,X 有什么真正轻量级的东西吗?

http://www.linux-magazine.com/Issues/2009/99/Zenity-and-KDialog

kdialog --title "Do you want to run the backup script?"
--yesno "Do you want to run the backup script?"

我目前倾向于 zenity,唯一的问题是它在 kde 上引入了一系列 gtk 依赖项,但它是跨平台的并且可以在 Windows 上运行。本质上,这正是我想要的:

if zenity --question --text="Please press a button."; then
    zenity --info --text="You pressed Yes\!"
else
    zenity --error --text="You pressed No\!"
fi

但希望它在资源/依赖项上会轻很多。有什么替代建议吗?

【讨论】:

    【解决方案2】:

    一种简单的方法是让自动化脚本简单地向您发送电子邮件,或者通过wall 发出警告并附上说明(包含真实脚本的位置)。

    另一种方法是自动脚本将touch/var/lib 中的一个文件发送到/var/lib,如果该文件在 5 分钟后仍然存在,则继续。这使用户可以选择停止进程(通过删除文件),但保持一定程度的自动化。

    【讨论】:

    • 我更关注即时弹出/用户对话框样式交互
    【解决方案3】:

    这不是你应该首先让 cron 或 udev 处理的事情。编写一个用户态守护进程,监听相应的 D-Bus 消息并执行相应的操作。

    【讨论】:

    • 是否有充分的理由不使用 udev?我有各种或外围设备的udev手柄插件,如外接显示器等,为什么不应该将它用于外接硬盘?我相信你有一点,只是好奇..
    • 是的。它不进行用户交互。
    • 是的,有点,这就是为什么要问这个问题,可以让 udev 使用 konsole -e /path/rsync_back.sh 启动脚本并使用读取或对话框来获取用户输入(需要检测本地终端程序,这是我想避免的)或使用 zenity。编写守护程序可能更不便携,并且具有更多依赖项
    • 您正在做的事情一开始就不是可移植的。 Windows 和 OS X 有完全不同的热插拔通知机制。
    • 是的,而且我都没有使用它,我想我可能会坚持使用 kdialog
    【解决方案4】:

    这应该在 linux 或超级用户或服务器故障中发布。

    但是,linux read user input 上排名第一的谷歌搜索链接回到 StackOverflow: https://www.google.com/search?q=linux+read+user+input&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a&channel=fflb

    所以我想这不是太离谱。

    再次,linux 调用命令 USB 设备插件 的第三个左右的 google 结果链接到 ServerFault: https://serverfault.com/questions/399698/execute-a-command-when-a-device-is-connected-via-usb

    我将把这两者结合起来作为练习。

    【讨论】:

    • 我认为问题的理解有误,我知道如何调用 USB udev 规则并收集用户输入。问题是如何从后台运行的脚本中收集用户输入,而不是在活动控制台中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多