我在自动生成csv文件时遇到了一些问题。用于生成csv的bash代码使用3个内核并行工作,以减少时间消耗;最初生成不同的csv文件,这些文件随后组合在一起形成单个csv文件。代码的核心是这个循环:
...
waitevery=3
for j in `seq 1 24`; do
if((j==1)); then
printf '%s\n' A B C D E | paste -sd ',' >> code${namefile}01${rr}.csv
fi
j=$(printf "%02d" $j)
../src/thunderstorm --mask-file=mask.grib const_${namefile}$j${rr}.grib surf_${namefile}$j${rr}.grib ua_${namefile}$j${rr}.grib hl_const.grib out &
if ! ((c % waitevery)); then
wait
fi
c=$((c+1))
done
...
其中../src/thunderstorm
是.F90代码,用于生成第二个和后续文件。
如果我手动运行此代码,它会生成正确的csv文件,但是如果我通过编程的crontab命令运行它,它会生成一个带有唯一标题{c} {/ p>的csv文件
一些建议? 谢谢!
答案 0 :(得分:1)
cron在一个环境中运行你的脚本,这通常与你的期望不符。
检查PATH
是否正确以及是否从正确的位置调用脚本:../src
显然是相对的,但是对于什么?
在使用输入,输出和程序的完整路径时,我发现cron脚本更加可靠。
答案 1 :(得分:1)
正如@umläute所指出的, cron 运行您的脚本,但不会运行您打开终端会话时可能具有的典型初始化。这意味着您不必对您的环境做出任何假设。
对于可以从shell调用并且可以从 cron 调用的脚本,我通常在开头添加如下内容:
BIN_DIR=/home/myhome/bin
PATH=$PATH:$BIN_DIR
此外,请确保不要使用../src/thunderstorm
等可执行文件的相对路径。 cron 调用的脚本的工作目录可能不是您的想法。您可以使用$BIN_DIR/../src/thunderstorm
。如果要保存输入,请将相关目录添加到PATH
。
所有其他shell变量都采用相同的逻辑。
在脚本开头做一个好的初始化,你可以从shell运行它来进行测试(或手动执行),然后把它作为 cron 作业运行。