You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让程序在xdg-open打开的查看器结束后再删除临时文件?

解决xdg-open不等待查看器退出导致临时文件提前删除的问题

以下是几种可行的解决思路,按需选择:

方法一:直接调用默认应用程序(最可靠)

xdg-open本质是调用系统默认的对应MIME类型应用,我们可以跳过xdg-open,直接启动该应用并等待其退出:

  1. 获取临时文件的MIME类型:
MIME_TYPE=$(xdg-mime query filetype /path/to/your/temp/file)
  1. 查询对应MIME类型的默认应用:
DEFAULT_APP=$(xdg-mime query default "$MIME_TYPE")
  1. 提取默认应用的执行命令(处理.desktop文件中的占位符):
# 读取.desktop文件的Exec字段,去除%f/%U等占位符和引号
EXEC_CMD=$(grep -E "^Exec=" "/usr/share/applications/$DEFAULT_APP" | sed 's/^Exec=//; s/%[fFuU]//g; s/^"//; s/"$//')
  1. 启动应用并等待退出,之后删除临时文件:
$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:02:23