如何将定时运行的Shell脚本改为仅在输入文件有内容时执行?
解决方案
要实现仅当$LIST文件有内容时才执行文件搜索逻辑,同时让脚本持续后台运行,需将脚本改为循环检测模式。核心思路是让脚本无限循环,定期检查$LIST是否非空,有内容则执行搜索,完成后清空文件避免重复处理。以下是修改并优化后的完整脚本:
################################################################# # Function WriteLog # # # # To display status with time # # # ################################################################# function WriteLog { echo -e "[$(date -u)] \t $1" >> "$Logfile" } ################################################################# # Function SEARCH_File # # # # To Search file for copy to transfer directory # # # ################################################################# SEARCH_File () { # 安全读取$LIST内容,处理含空格/特殊字符的关键词 while IFS= read -r i do # 搜索包含当前关键词的最新文件 search_file=$(find "$Search_directory" -name "*$i*" | tail -n 1) sleep 2 # 判断是否找到文件 if [ -z "$search_file" ] then WriteLog "File containing '$i' not found." else cp "$search_file" "$TransferDir" WriteLog "Copied file: $search_file to $TransferDir" fi sleep 1 done < "$LIST" } ################################################################# # Function SUB_LOCKFILE # # # # Checks if process is running already # # # ################################################################# SUB_LOCKFILE () { if [ -f "$Process_ISRunning" ] then lpid=$(cat "$Process_ISRunning") # 检查进程是否存活,抑制错误输出 if kill -0 "$lpid" 2>/dev/null then WriteLog "The associated process ${lpid} is still alive - exit now!" exit 1 else WriteLog "Lockfile will be replaced with a new one!" echo $$ > "$Process_ISRunning" fi else WriteLog "Lockfile does not exist, create lockfile now!" echo $$ > "$Process_ISRunning" fi } ################################################################# # MAIN # # # # Main program # # # ################################################################# # 无限循环检测$LIST状态 while true do # 仅当$LIST非空时执行逻辑 if [ -s "$LIST" ]; then # 检查是否已有运行实例 SUB_LOCKFILE WriteLog "File searching STARTED" SEARCH_File # 清空$LIST,避免重复处理相同内容 > "$LIST" # 删除锁文件 rm "$Process_ISRunning" fi # 休眠20分钟后再次检查(1200秒,可按需调整) sleep 1200 done
关键改动说明
- 循环检测机制:通过
while true实现脚本持续运行,每次循环后休眠指定时长,定期检查$LIST状态 - 非空判断:使用
[ -s "$LIST" ]判断文件是否非空,避免无意义的运行 - 安全读取优化:将
for i in $(<$LIST)改为while IFS= read -r i,支持处理包含空格或特殊字符的关键词 - 变量安全引用:所有变量添加双引号包裹,避免因空格、特殊字符导致的执行错误
- 重复处理防护:执行完搜索后立即清空
$LIST,防止下一次循环重复处理相同内容 - 错误抑制:在
kill -0后添加2>/dev/null,避免进程不存在时输出冗余错误信息到日志
启动方式
使用nohup让脚本在后台持续运行:
nohup ./Search_file.sh > /dev/null 2>&1 &
内容的提问来源于stack exchange,提问作者Miss aya
相关产品推荐
相关产品推荐

