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

如何将定时运行的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:37:28