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

手动运行正常的Bash脚本通过Cron执行时提示文件不存在错误

解决Cron执行Bash脚本时找不到文件的问题

问题原因

Cron执行脚本时默认工作目录是你的用户主目录(/home/kali),而非脚本所在的~/Documents/GitHub/BFOR206/目录。你脚本里用了hw1_input.txt这种相对路径,Cron会去主目录找,自然找不到。另外你定义了hw1_input变量但根本没用到,纯属多余。

简单解决方法

方法1:全用绝对路径

把脚本里所有文件路径换成完整的绝对路径,这样不管在哪执行都能精准找到文件:

#!/bin/bash

# 直接写死绝对路径,简单明了
input_file="/home/kali/Documents/GitHub/BFOR206/hw1_input.txt"
output_log="/home/kali/Documents/GitHub/BFOR206/hw1_output.log"

while read -r address; do
    ping -c 1 "$address" > /dev/null

    if [ $? -eq 0 ]; then
        echo "Ping successful for $address at $(date)" >> "$output_log"
    else
        echo "Ping failed for $address at $(date)" >> "$output_log"
        echo "Ping failed for $address at $(date)" | mail -s "Ping Error!" kali@kali
    fi
done < "$input_file"

方法2:先切到脚本所在目录

在脚本开头加切换目录的命令,让后续相对路径都基于脚本所在文件夹:

#!/bin/bash

# 切换到当前脚本所在目录,切换失败就直接退出
cd "$(dirname "$0")" || exit 1

# 现在可以放心用相对路径了
input_file="hw1_input.txt"
output_log="hw1_output.log"

while read -r address; do
    ping -c 1 "$address" > /dev/null

    if [ $? -eq 0 ]; then
        echo "Ping successful for $address at $(date)" >> "$output_log"
    else
        echo "Ping failed for $address at $(date)" >> "$output_log"
        echo "Ping failed for $address at $(date)" | mail -s "Ping Error!" kali@kali
    fi
done < "$input_file"

额外注意

  • 改完脚本后手动运行一次:bash ~/Documents/GitHub/BFOR206/hw1.sh,确认正常工作
  • Cron任务配置不用改,保持原来的*/5 * * * * bash ~/Documents/GitHub/BFOR206/hw1.sh即可

内容的提问来源于stack exchange,提问作者Karly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 06:40:24