如何让程序在xdg-open打开的查看器结束后再删除临时文件?
解决xdg-open不等待查看器退出导致临时文件提前删除的问题
以下是几种可行的解决思路,按需选择:
方法一:直接调用默认应用程序(最可靠)
xdg-open本质是调用系统默认的对应MIME类型应用,我们可以跳过xdg-open,直接启动该应用并等待其退出:
- 获取临时文件的MIME类型:
MIME_TYPE=$(xdg-mime query filetype /path/to/your/temp/file)
- 查询对应MIME类型的默认应用:
DEFAULT_APP=$(xdg-mime query default "$MIME_TYPE")
- 提取默认应用的执行命令(处理.desktop文件中的占位符):
# 读取.desktop文件的Exec字段,去除%f/%U等占位符和引号 EXEC_CMD=$(grep -E "^Exec=" "/usr/share/applications/$DEFAULT_APP" | sed 's/^Exec=//; s/%[fFuU]//g; s/^"//; s/"$//')
- 启动应用并等待退出,之后删除临时文件:
$EXEC_CMD /path/to/your/temp/file rm /path/to/your/temp/file
方法二:跟踪查看器进程
如果无法直接调用默认应用,可以先启动xdg-open,再找到它唤起的查看器进程并等待其结束:
# 启动xdg-open后台运行 xdg-open /path/to/your/temp/file & XDG_PID=$! # 等待xdg-open自身退出 wait $XDG_PID # 用lsof找到正在使用临时文件的进程PID VIEWER_PIDS=$(lsof -t /path/to/your/temp/file) # 等待所有相关进程结束 for pid in $VIEWER_PIDS; do wait $pid 2>/dev/null done # 删除临时文件 rm /path/to/your/temp/file
注意:需要提前安装lsof工具(如sudo apt install lsof),部分查看器可能会fork子进程后让父进程退出,这种情况可能需要用pstree进一步跟踪子进程树。
方法三:监听文件系统事件(简易版)
使用inotifywait监听临时文件的关闭事件,等待查看器释放文件后再删除:
# 先安装inotify-tools:sudo apt install inotify-tools xdg-open /path/to/your/temp/file & # 监听文件的关闭写入或自身删除事件 inotifywait -e close_write -e delete_self /path/to/your/temp/file rm /path/to/your/temp/file
缺点:部分查看器会先读取文件到内存后立即关闭,或创建文件副本,可能导致事件提前触发,建议结合进程检查使用。
内容的提问来源于stack exchange,提问作者Heidi Ngew
相关产品推荐
相关产品推荐

