【问题标题】:FTP Shell Script Not Working With CronjobFTP Shell 脚本不适用于 Cronjob
【发布时间】:2013-09-09 03:16:36
【问题描述】:

好的,所以我每天晚上都在尝试将一些录音文件 ftp 到远程服务器进行备份。它获取今天创建的文件并传输它们。它工作得很好,但前提是我手动运行它。 cronjob 不运行它。

这是当前脚本:

#!/bin/bash
touch -t $(date +"%Y%m%d0000") /tmp/$$

NOW=$(date +"%d-%m-%Y")
HOST='remote_server'  
USER='ftp_user'             
PASS='ftp_password'          

#create directory with date as the name, copy recordings.php for interface
ftp -inv $HOST << EOF
user $USER $PASS
mkdir /recordings/$NOW
cd /recordings/$NOW
put recordings.php
bye
EOF

find  -name '*.mp3' -newer /tmp/$$ |
while read FILE
do
ftp -in $HOST << EOF
user $USER $PASS
cd /recordings/$NOW
put $FILE
bye
EOF

done

rm -f /tmp/$$

然后我像这样在 crontab 中设置它,所以它每天晚上 11 点运行:

* 21 * * * /var/spool/asterisk/monitorDONE/MP3/recording_script.sh

非常感谢任何帮助。我知道这可能不是最好的方法,这只是我遇到的第一个对我有用的方法,所以我愿意接受任何建议。

【问题讨论】:

  • cronjob是完全没有运行还是没有运行成功?
  • 方法看起来没问题。 record_script.sh 是可执行文件吗?对其执行 chmod 755 recording_script.sh 并再次通过 cron 运行它。检查 cron 日志文件以查看作业的输出。 Cron 日志可能在 /var/log 或 var/log/syslog 下
  • 这是 cron 尝试运行脚本时的日志内容:Sep 8 21:04:01 vici crond[16478]: (root) CMD (/var/spool/asterisk/monitorDONE/MP3/recording_script.sh) Sep 8 21:04:01 vici crond[16477]: (root) NULL security context for user, but SELinux in permissive mode, continuing ()
  • 所以脚本在它应该运行的时候运行。它为文件创建新目录,只是不复制任何文件。
  • 没有路径部分的 find 语句是故意的吗?从 cronjob 执行时,find 可能会在其他地方执行。

标签: linux shell ftp cron


【解决方案1】:

您可能需要检查您的 PATH 变量并将 /usr/local/bin 添加到其中,例如 ftp 安装在那里。

另外,添加

... > /tmp/script.log 2>&1

将提供有关 cronjob 失败原因的更多信息(或至少不执行任何操作。

尝试在您的 cronjob 命令前加上

bash -x ...

在执行时显示每个 shell 语句。

完整的 crontab 行:

* 21 * * * bash -x /var/spool/asterisk/monitorDONE/MP3/recording_script.sh >/tmp/rs_log 2>&1

希望这有助于调试您的问题。

【讨论】:

  • 太棒了。使用该调试,我能够找出我的问题。在 find 语句和 while 循环之前,我必须 cd 到我正在搜索的文件夹 (/var/spool/asterisk/monitorDONE/MP3/),然后它运行良好。谢谢大家。