Bash:启动impressive后无需等待退出,直接进入while循环下一次迭代
问题解决:自动监控文件夹并重启PDF幻灯片查看器Impressive
需求概述
- 启动Impressive PDF幻灯片查看器,按页展示指定文件夹内所有PDF文件
- 监控目标文件夹的文件变化(添加、删除等操作)
- 检测到变化时重启查看器,加载更新后的文件夹内容
- 持续保持监控状态
原脚本问题
原脚本运行时,首次启动Impressive后程序会持续占用进程,导致while循环卡在第一次迭代,必须手动终止Impressive,inotifywait才会继续监控。尝试用nohup后台启动Impressive时,出现内存瞬间占满、机器死机的问题。
原脚本代码:
#!/bin/bash TESTPATH="/some/path/" while true; do inotifywait -e create,delete,moved_from -r "$TESTPATH" && \ echo "DEBUG: Event detected!" && pkill -f /usr/bin/impressive || true && impressive -a 10 -w "$TESTPATH*.pdf" done
修正后的解决方案
改用inotifywait的持续监控模式,配合管道读取事件,同时将Impressive后台启动,避免阻塞循环执行。修正后的脚本:
#!/bin/bash TESTPATH="/some/path/" inotifywait -m "$TESTPATH" -e moved_to -e moved_from -e delete | while read -r directory action file; do { echo "DEBUG: Event detected!" && pkill -f /usr/bin/impressive || true && impressive -a 10 -w "$TESTPATH*.pdf" & } done
关键改进说明
- 使用
inotifywait -m(持续监控模式),无需重复启动监控进程,保持持续监听状态 - 通过管道将监控事件传递给while循环,每次触发事件就执行重启逻辑
- 在
impressive命令后添加&,让程序后台运行,不会阻塞循环继续执行 - 调整监控事件为
moved_to、moved_from、delete,更精准覆盖文件增删的场景
内容的提问来源于stack exchange,提问作者Photon
相关产品推荐
相关产品推荐

