gpt4 book ai didi

linux - Perl脚本Cron/环境问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:11 25 4
gpt4 key购买 nike

下面的perl脚本从文本文件生成一个.xls文件。它在我们的linux测试环境中运行得很好,但是当通过cron(cron也可以在测试中工作)运行时,会在我们的生产环境中生成一个空的电子表格(.xls)。在系统级设置方面,我们的系统管理员不会跳出任何可能导致这种行为的设置。在import_data子例程的脚本底部,会报告正确的行数,但不会向电子表格写入任何内容,也不会在脚本或系统级别返回任何错误。我通过perl调试器运行它,但我的技能还不能交互式地观察它填充文件。cron条目如下所示:

cd <script directory>; cvs2xls input.txt output.xls 2>&1

任何调试技巧,以及潜在的系统设置,我可以转发给我们的系统管理员将不胜感激。
#!/usr/bin/perl
use strict;
use warnings;

use lib '/apps/tu01688/perl5/lib/perl5';

use Spreadsheet::WriteExcel;
use Text::CSV::Simple;

BEGIN {
unshift @INC, "/apps/tu01688/jobs/mayo-expert";
};

my $infile = shift;
usage() unless defined $infile && -f $infile;
my $parser = Text::CSV::Simple->new;
my @data = $parser->read_file($infile);
my $headers = shift @data;

my $outfile = shift || $infile . ".xls";
my $subject = shift || 'worksheet';

sub usage {
print "csv2xls infile [outfile] [subject]\n";
exit;
}

my $workbook = Spreadsheet::WriteExcel->new($outfile);
my $bold = $workbook->add_format();
$bold->set_bold(1);
import_data($workbook, $subject, $headers, \@data);

# Add a worksheet
sub import_data {
my $workbook = shift;
my $base_name = shift;
my $colums = shift;
my $data = shift;
my $limit = shift || 50_000;
my $start_row = shift || 1;
my $worksheet = $workbook->add_worksheet($base_name);
$worksheet->add_write_handler(qr[\w], \&store_string_widths);
#$worksheet->add_write_handler(qr[\w]| \&store_string_widths);
my $w = 1;
$worksheet->write('A' . $start_row, $colums, ,$bold);
my $i = $start_row;
my $qty = 0;
for my $row (@$data) {
$qty++;
if ($i > $limit) {
$i = $start_row;
$w++;
$worksheet = $workbook->add_worksheet("$base_name - $w");
$worksheet->write('A1', $colums,$bold);
}
$worksheet->write($i++, 0, $row);
}
autofit_columns($worksheet);
warn "Converted $qty rows.";
return $worksheet;
}


###############################################################################
###############################################################################
#
# Functions used for Autofit.
#

###############################################################################
#
# Adjust the column widths to fit the longest string in the column.
#
sub autofit_columns {

my $worksheet = shift;
my $col = 0;

for my $width (@{$worksheet->{__col_widths}}) {

$worksheet->set_column($col, $col, $width) if $width;
$col++;
}
}


###############################################################################
#
# The following function is a callback that was added via add_write_handler()
# above. It modifies the write() function so that it stores the maximum
# unwrapped width of a string in a column.
#
sub store_string_widths {

my $worksheet = shift;
my $col = $_[1];
my $token = $_[2];

# Ignore some tokens that we aren't interested in.
return if not defined $token; # Ignore undefs.
return if $token eq ''; # Ignore blank cells.
return if ref $token eq 'ARRAY'; # Ignore array refs.
return if $token =~ /^=/; # Ignore formula

# Ignore numbers
#return if $token =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;

# Ignore various internal and external hyperlinks. In a real scenario
# you may wish to track the length of the optional strings used with
# urls.
return if $token =~ m{^[fh]tt?ps?://};
return if $token =~ m{^mailto:};
return if $token =~ m{^(?:in|ex)ternal:};


# We store the string width as data in the Worksheet object. We use
# a double underscore key name to avoid conflicts with future names.
#
my $old_width = $worksheet->{__col_widths}->[$col];
my $string_width = string_width($token);

if (not defined $old_width or $string_width > $old_width) {
# You may wish to set a minimum column width as follows.
#return undef if $string_width < 10;

$worksheet->{__col_widths}->[$col] = $string_width;
}


# Return control to write();
return undef;
}


###############################################################################
#
# Very simple conversion between string length and string width for Arial 10.
# See below for a more sophisticated method.
#
sub string_width {

return length $_[0];
}

最佳答案

嗯..不要在cron中放置链接命令,而是使用外部脚本。总之:一些可能有助于您的建议:
调试cron命令
检查邮件!默认情况下,cron会将命令的任何输出发送给运行命令的用户。如果没有输出,就没有邮件。如果希望cron将邮件发送到其他帐户,则可以在crontab文件中设置mail to环境变量,例如。

MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command

自己捕获输出
1 2 * * *  /path/to/your/command &>/tmp/mycommand.log

它将stdout和stderr捕获到/tmp/mycommand.log
查看日志;cron通过syslog记录其操作,syslog(取决于您的设置)通常转到 /var/log/cron/var/log/syslog
如果需要,您可以使用例如
grep CRON /var/log/syslog 

现在我们已经介绍了cron的基本知识,文件在哪里以及如何使用它们,让我们看看一些常见的问题。
检查cron是否正在运行
如果cron没有运行,那么您的命令将不会被调度…
ps -ef | grep cron | grep -v grep

应该给你买点
root    1224   1  0 Nov16 ?    00:00:03 cron


root    2018   1  0 Nov14 ?    00:00:06 crond

如果不重新启动
/sbin/service cron start


/sbin/service crond start

可能还有其他方法;使用发行版提供的方法。
cron在受限制的环境中运行您的命令。
可用的环境变量可能非常有限。通常,您只需要定义几个变量,例如 $LOGNAME$HOME$PATH
特别值得注意的是 PATH仅限于 /bin:/usr/bin。绝大多数“我的cron脚本不工作”问题都是由这种限制性路径引起的。如果您的命令位于不同的位置,可以通过以下几种方法解决此问题:
提供命令的完整路径。
1 2 * * * /path/to/your/command

在crontab文件中提供适当的路径
PATH=/usr:/usr/bin:/path/to/something/else
1 2 * * * command

如果命令需要其他环境变量,也可以在crontab文件中定义它们。
cron使用cwd=$home运行命令
无论您执行的程序位于文件系统的哪个位置,cron运行时程序的当前工作目录都将是用户的主目录。如果访问程序中的文件,如果使用相对路径,则需要考虑到这一点,或者(最好)在任何地方都使用完全限定的路径,从而避免所有人都感到困惑。
crontab中的最后一个命令没有运行
cron通常要求用新行终止命令。编辑crontab;转到包含最后一个命令的行的末尾并插入一个新行(按enter键)。
检查crontab格式
不能为/etc/crontab或/etc/cron.d中的片段使用用户crontab格式的crontab,反之亦然。用户格式化的crontab在行的第6个位置不包含用户名,而系统格式化的crontab包含用户名并以该用户的身份运行命令。
我在/etc/cron.{hourly,daily,weekly,monthly}中放了一个文件,但它不运行
检查文件名是否没有扩展名请参见 run-parts
确保文件具有执行权限。
告诉系统在执行脚本时要使用什么(例如,将 #!/bin/sh放在顶部)
cron日期相关错误
如果您的日期最近被用户或系统更新、时区或其他更改,那么crontab将开始表现异常,并显示奇怪的错误,有时工作,有时不工作。这是crontab试图在时间从下面改变时“做你想做的事”。“分钟”字段在小时更改后将变为无效。在这种情况下,只接受星号。重新启动cron并在不连接到Internet的情况下重试(因此日期没有机会重置为时间服务器之一)。
百分比符号,再次
为了强调有关百分号的建议,下面是cron对百分号的处理示例:
# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz

将创建包含3行的~/cron.out文件
foo
bar
baz

当使用 date命令时,这尤其具有侵入性。一定要避开百分号
* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"

关于linux - Perl脚本Cron/环境问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54352666/

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