该while循环实在不是一个好主意。那里没有逃脱-它会永远永久地- 静态运行。环境中的任何事物都可能发生变化,并且不会受到影响-这可能很糟糕。
例如,如果负责该while循环的shell可执行文件已升级,则内核将无法释放旧版本的磁盘空间,直到该脚本退出为止,因为该脚本需要在运行时一直保持描述符。不管是出于任何原因,shell都可能打开该文件以运行该循环-它们将一直保持打开状态,while直到运行为止。
而且,如果天哪,在运行该循环的外壳程序中任何地方都存在内存泄漏,即使是在最短的时间内,它也将继续静态地泄漏。它会不受限制地构建,唯一的办法是强行杀死它,然后重新启动它以稍后再做。
确实,这不是设置后台进程的方式-至少,我认为不是。相反,按照我的想法,应该有一个重置点-刷新脚本及其状态。最简单的方法是使用exec。您可以用一个新进程替换当前进程-保持相同的PID-但仍在运行一个新进程。
例如,如果您的perl脚本在成功处理了某些受监视目录中的文件修改后应返回true:
#!/bin/sh
trap 'rm -rf -- "${ldir%%*.}"' 0 INT
_exec() case $# in
(0) exec env - "PID=$$" "ldir=${TMPDIR:-/tmp}/." \
"$0" "$@";;
(*) export "$@" "boff=0" "lmt=30"
exec "$0" "$@";;
esac
[ "$PID" = "$$" ] || _exec
[ -w "$ldir" ] &&
case $ldir in
(*.) until mkdir -- "$ldir"
do :& ldir=$ldir$$$!
done 2>/dev/null
;;
(*) until /someperlscript.pl ||
[ "$((boff+=1))" -ge "$lmt" ]
do [ -d "$ldir" ] &&
sleep "$boff" || ! break
done
;;esac && _exec ldir PID
...或类似的东西。允许循环背后的基本机制每隔一段时间刷新一次的东西。
inotifyAPI,以便避免在目标目录中等待文件更改的繁忙循环。