我已经创建了perl脚本,我将在其中连接到vsql并运行查询。当我手动运行脚本时,它会按预期创建输出文件。但是,当我在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有谁能帮帮我做错了什么吗?
发布于 2021-10-05 09:54:03
您的输出将写入一个名为dumpfile_[timestamp].txt的文件。但是那个文件在哪里呢?
您的命令不包含该文件的目录路径。因此,它将被写入当前目录。cronjob的当前目录是拥有该cronjob的用户的主目录。你试过看那里吗?
更具体地说明您希望将文件写入到哪个目录总是更好。有两种方法可以做到这一点:
*/2 * * * * cd /some_directory_path && /usr/bin/perl /tmp/test.pl
-o /some_directory_path/dumpfile_" . $timenow . ".txt
更新:好的,拍两张。
谁拥有这个cronjob?cronjob的任何输出都将通过电子邮件发送给所有者。而且肯定会有输出,因为你有一条print()语句。任何错误都将包含在同一电子邮件中。你收到那封邮件了吗?里面有什么?
如果您没有收到电子邮件,您可以通过在crontab中添加一个MAILTO参数来更改发送电子邮件的地址。它看起来像这样:
MAILTO=someone@example.com
*/2 * * * * /usr/bin/perl /tmp/test.pl请记住,服务器可能未设置为发送外部电子邮件,因此您可能需要使用服务器上的本地mail程序。
如果不能处理电子邮件,可以在/var/log/syslog中查找cron错误(或者,在systemd系统上,尝试使用journalctl _COMM=cron)。
print()的输出将被输出到某个地方。你需要追踪它。
https://stackoverflow.com/questions/69447011
复制相似问题