0

我已经创建了连接到 vsql 并运行查询的 perl 脚本。当我手动运行脚本时,它会按预期创建输出文件。但是当我在 crontab 中设置此脚本时,不会生成输出文件。perl 脚本如下

#!/usr/bin/perl
$timenow = `date "+%H_%M"`;
chomp($timenow);
$cmd = "/opt/vertica/bin/vsql -d xxxx-U xxxxx -w xxxxx -F \$'--FSEP--' -At -o dumpfile_" . $timenow . ".txt -c \"SELECT CURRENT_TIMESTAMP(1) AS time;\"";
print "$cmd\n";
system($cmd);

下面是contab条目

*/2 * * * * /usr/bin/perl /tmp/test.pl

有人可以帮我做错吗?

4

1 回答 1

2

您的输出被写入一个名为dumpfile_[timestamp].txt. 但是那个文件在哪里?

您的命令不包含该文件的目录路径。所以它将被写入当前目录。cronjob 的当前目录是拥有 cronjob 的用户的主目录。你试过在那里看吗?

最好更具体地确定要将文件写入哪个目录。两种方法是:

  1. 在运行命令之前切换到目录
    */2 * * * * cd /some_directory_path && /usr/bin/perl /tmp/test.pl
  2. 在 Perl 程序中包含完整路径
    -o /some_directory_path/dumpfile_" . $timenow . ".txt

更新:好的,拿两个。

谁拥有这个 cronjob?cronjob 的任何输出都将通过电子邮件发送给所有者。当你有一个print()声明时,肯定会有输出。任何错误都将包含在同一封电子邮件中。你收到那封电子邮件了吗?这里面是什么?

如果您没有收到电子邮件,您可以通过向MAILTOcrontab 添加参数来更改电子邮件发送到的地址。它看起来像这样:

MAILTO=someone@example.com
*/2 * * * * /usr/bin/perl /tmp/test.pl

请记住,服务器可能未设置为发送外部电子邮件,因此您可能需要使用mail服务器上的本地程序。

如果您无法让电子邮件正常工作,您可以在/var/log/syslog(或者,在systemd系统上,尝试journalctl _COMM=cron)中查找 cron 错误。

print()输出正在某处。你需要追踪它。

于 2021-10-05T09:54:03.300 回答