gpt4 book ai didi

linux - Crontab 中的 Perl 脚本没有在一夜之间移动文件

转载 作者:太空宇宙 更新时间:2023-11-04 04:35:42 26 4
gpt4 key购买 nike

我有一个脚本可能需要一段时间才能执行。每分钟执行一次。它一直有效:

while ( my $file = readdir $dir ) {

next if (
$file eq "."
or $file eq ".."
or $file eq ".bashrc"
or $file eq ".bash_logout"
or $file eq ".bash_profile" );

my ( $ext ) = $file =~ /(\.[^.]+)$/;

if ( $ext eq ".pdf" ) {

my $from = $print_direction . "/" . "$file";

move( $from, $PDF_direction );

my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime( time );
$year = $year + 1900;
$mon++;

my $date = "$year-$mon-$mday $hour:$min:$sec \n";
my $insert_sql = "INSERT INTO registerPDF (id, file_name, created_at) VALUES ( '$id' , '$file' , '$date')";
my $insert_sth = $dbh->prepare( $insert_sql );
$insert_sth->execute();

chmod 0755, $PDF_direction . "/" . "$file";
chown 48, 48, $PDF_direction . "/" . "$file";
}

这几个月来效果一直很好。

我最近添加了另一个重新启动服务器的 Crontab 脚本

system("reboot");

昨天,一个文件被移动到了应该移动的位置,但在数据库中从未找到其条目。

我担心这是由于移动大文件后触发的系统重新启动引起的。日志没有显示任何内容。

有什么想法吗?

最佳答案

好吧,除了 crontab 重新启动有点肮脏之外 - 像这样的“readdir”类型操作往往会破坏的主要问题是,您没有将 $dir 添加到任何后续修改中。因此,您可能正在读取与当前工作目录不同的$dir

但另一种可能性是,您的重新启动意味着某些 transient 状态不存在,或者脚本被部分中止,或者数据库可能没有运行,因为您的脚本不检查返回代码。如果它“每分钟运行一次”并且“需要一段时间”,那么重启很可能会中断它。

主要是我猜测,因为您询问的很多事情都不包含在您的脚本中,所以这不是一个可重现的问题。

但是,我还要指出一些事情:

  • readdir 指定了 $dir,但 move 没有指定。 $print_direction 是否有可能与 $dir 不匹配?
  • opendir然后拒绝一堆东西,寻找.pdf。为什么不改为: foreach my $file ( glob "$dir/*.pdf") { 因为它内置了路径。
  • 您是否考虑过使用 Time::Piece,而不是像这样调整 localtime:my $date_str = localtime -> strftime("%Y-%m-%d %H:%M:%S");
  • 您没有检查任何返回代码。如果服务器重新启动,则在 move 运行时数据库很可能实际上并未运行,特别是如果它每分钟发生一次。

关于linux - Crontab 中的 Perl 脚本没有在一夜之间移动文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43226012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com