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 &);
技巧可以抑制任何额外的输出到您的终端。-print0
并xargs -0
一起使文件名可播放,即使包含换行符特殊字符。- 你需要,
--player-operation-mode=pseudo-gui
因为 mp3 仅是音频,默认情况下没有视频 GUI 弹出窗口来让你控制。并且不要放入xargs -o
,它将不起作用atd
。 XDG_CURRENT_DESKTOP
、GNOME_DESKTOP_SESSION_ID
、DBUS_SESSION_BUS_ADDRESS
、DISPLAY
是GNOME桌面环境中重要的环境变量,它们使一些GUI应用程序能够正常工作并能够显示。对于mpv
播放 mp3,关键变量是DISPLAY
。
就像 cron 等其他守护进程一样,atd
也缺乏使 gui 应用程序正常工作的环境变量,如下所述man at
:
对于 at 和 batch,命令都是从标准输入或使用 -f 选项指定的文件读取并执行。工作目录、环境(除了变量 BASH_VERSINFO、 展示、EUID、GROUPS、SHELLOPTS、TERM、UID 和 _) 和 umask 从调用时起保留
展示对于其他 GUI 应用程序来说可能还不够,在这种情况下,在不深入源代码的情况下找出系统中程序所需的环境变量:
运行
declare -p > /tmp/d.sh
以保存环境变量名称的属性和值。env > /tmp/d.sh
会去掉引号,不适合直接重复使用,这就是我建议使用的原因declare -p > /tmp/d.sh
。将其保存在您的
/tmp/test.sh
:. /tmp/d.sh mpv --player-operation-mode=pseudo-gui foo.mp3
并不断测试该脚本。如果能正常播放,则删除一半缩小范围
/tmp/d.sh
;否则撤消已删除的内容并尝试删除另一部分。但确保不要删除一半的declare
语句。并且您无需删除DISPLAY
GUI 应用程序通常需要的内容。env -i bash /tmp/test.sh
最终您可以获得程序的关键环境变量。这个概念是
env -i
删除所有环境变量,然后获取剩余的环境变量。此方法不能保证所有功能正常工作,例如程序启动缓慢,因为某些功能可能需要不同的变量。您需要重复这些步骤来找出该函数。
另外,不要忘记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) &