手动运行正常的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
相关产品推荐
相关产品推荐

