在指定时间运行命令

在指定时间运行命令

at我学习了在指定时间运行脚本的命令计划

at -f -m ./test.sh now + 10 minutes

我怎样才能用来at安排一个command

假设情况,

我搜索所有音乐但在后台默默运行

find / -name *.mp3 1> ~/desktop/all_musics.md 2>/dev/null &

我打算all_musics.md十分钟后自动打开。

open all_music.md at now + 10 minutes

有可能完成吗?

答案1

at 接受以下标准的输入:

$ echo 'find / -name *.mp3 > ~/desktop/all_musics.md 2>/dev/null' | at now + 10 minutes

答案2

find /搜索整个系统中的所有文件效率不高,您应该缩小搜索路径。

认为:

  • 您的 mp3 搜索路径是~/Downloads/misc/mp3/
  • 查找结果保存到播放列表路径~/Downloads/misc/mp3/my_mp3.list
  • 您的系统运行 gnome 桌面环境
  • mpv您的系统中安装了播放器。

您可以运行这个一行命令:

sudo service atd start;
(find ~/Downloads/misc/mp3/ -type f -iname '*.mp3' -print0 2>/dev/null >~/Downloads/misc/mp3/my_mp3.list &);
echo 'export "XDG_CURRENT_DESKTOP=GNOME";
export "GNOME_DESKTOP_SESSION_ID=this-is-deprecated";
export "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus";
export "DISPLAY=:0";
cat ~/Downloads/misc/mp3/my_mp3.list | xargs -0 mpv --player-operation-mode=pseudo-gui' | at now + 1 minute

解释:

  • sudo service atd start;启动atd守护进程,以防守护进程尚未运行。
  • at now + 1 minute并不是指一分钟后播放音频,而是指当前分钟的下一分钟播放,因此实际播放时间小于或等于 1 分钟。
  • 确保提供完整路径,因为at任务将在指定时间cd时转到原始路径。at如果您的目标相对路径不是该路径,它将不起作用。如果你at -c <pending_job_number>查询 shell 脚本内容你就会知道这一点。运行atq以了解待处理的作业数量。
  • ( 2>/dev/null &);技巧可以抑制任何额外的输出到您的终端。
  • -print0xargs -0一起使文件名可播放,即使包含换行符特殊字符。
  • 你需要,--player-operation-mode=pseudo-gui因为 mp3 仅是音频,默认情况下没有视频 GUI 弹出窗口来让你控制。并且不要放入xargs -o,它将不起作用atd
  • XDG_CURRENT_DESKTOPGNOME_DESKTOP_SESSION_IDDBUS_SESSION_BUS_ADDRESSDISPLAY是GNOME桌面环境中重要的环境变量,它们使一些GUI应用程序能够正常工作并能够显示。对于mpv播放 mp3,关键变量是DISPLAY

就像 cron 等其他守护进程一样,atd也缺乏使 gui 应用程序正常工作的环境变量,如下所述man at

对于 at 和 batch,命令都是从标准输入或使用 -f 选项指定的文件读取并执行。工作目录、环境(除了变量 BASH_VERSINFO、 展示、EUID、GROUPS、SHELLOPTS、TERM、UID 和 _) 和 umask 从调用时起保留

展示对于其他 GUI 应用程序来说可能还不够,在这种情况下,在不深入源代码的情况下找出系统中程序所需的环境变量:

  1. 运行declare -p > /tmp/d.sh以保存环境变量名称的属性和值。env > /tmp/d.sh会去掉引号,不适合直接重复使用,这就是我建议使用的原因declare -p > /tmp/d.sh

  2. 将其保存在您的/tmp/test.sh

    . /tmp/d.sh
    mpv --player-operation-mode=pseudo-gui foo.mp3
    
  3. 并不断测试该脚本。如果能正常播放,则删除一半缩小范围/tmp/d.sh;否则撤消已删除的内容并尝试删除另一部分。但确保不要删除一半的declare语句。并且您无需删除DISPLAYGUI 应用程序通常需要的内容。

    env -i bash /tmp/test.sh

  4. 最终您可以获得程序的关键环境变量。这个概念是env -i删除所有环境变量,然后获取剩余的环境变量。

  5. 此方法不能保证所有功能正常工作,例如程序启动缓慢,因为某些功能可能需要不同的变量。您需要重复这些步骤来找出该函数。

另外,不要忘记sleep命令的存在:

( (find ~/Downloads/misc/mp3/ -type f -iname '*.mp3' -print0 2>/dev/null >~/Downloads/misc/mp3/my_mp3.list) & pid=$!; sleep 600; kill -9 $pid 2>/dev/null; cat ~/Downloads/misc/mp3/my_mp3.list | xargs -0 mpv --player-operation-mode=pseudo-gui) &

相关内容