使用Perlbrew时从crontab运行Perl脚本

时间:2017-11-23 14:31:50

标签: perl cron perlbrew

我尝试了以下内容并发现它可以正常工作。这是由非特权用户完成的。首先找出 perl 命令的位置:

# which perl

然后检查PERL5LIB

的值
# echo $PERL5LIB

然后,在用户的crontab文件中,执行以下操作:

MAILTO=<my email address for the jobs output>
HOME=/home/myhome
PERL5LIB=/home/myhome/perl5/lib/perl5

0 2 * * * $HOME/<rest of path to perl>/perl $HOME/<path to my perl script> arg1 ...

这将在凌晨2点运行一个作业,似乎正确找到所有Perl库。我的问题是:这是完整的便携式吗?还有更好的方法吗?

我已经看到了许多 bash perl 脚本,它们应该为执行Perl脚本准备环境,但这似乎就足够了。欢迎任何建议!

编辑:从评论到问题,似乎我正在使用&#34;坏&#34; Perlbrew和local::lib的混合物。这里回答了确保库安装在特定Perlbrew版本中的方法:How do I install CPAN modules while using perlbrew?。当您使用cpan时,cpanmPERL5LIB都将安装在local::lib下,除非您明确告诉他们不这样做。同样cpanm似乎更适合与Perlbrew一起工作。

2 个答案:

答案 0 :(得分:2)

脚本的shebang(#!)行应该指向(perlbrew - 已安装)perl它应该在其下运行。 (这应该是安装脚本的一部分。)这就是你所需要的。

0 2 * * * /path/to/script arg1 ...

答案 1 :(得分:2)

如果您已经使用perlbrew管理了多个perl安装,最简单的方法就是使用perlbrew exec来运行您的脚本。 -q--with选项允许您静音多余的输出并选择特定版本的perl来运行脚本/作业。尝试类似:

  • perlbrew exec perl -E 'say "Hello from $]\n"'(这将显示perl的旧版本(< 5.10)中的错误,默认情况下不启用-E开关。
  • perlbrew exec -q --with 5.26.1 perl -E 'say "Hello from $]\n"'(这将运行命令并抑制信息输出)。
  • perlbrew exec -q --with 5.26.1 perl ~/script_from_heaven.pl(运行带有请求的perl版本的脚本)。
  • perlbrew exec -q --with 5.26.1 ~/script_from_heaven.pl(在脚本的shebang行中运行请求或硬编码的perl版本的脚本)。

我倾向于明确设置PERL5LIB并在我需要时使用local::lib 或者我专门安装所有的某些用户或环境$HOME/perl5/lib/perl5中的CPAN模块(比较完整的应用程序部署)。否则我发现从perlbrew运行perl非常方便。

我发现有帮助的一些事情:为alias环境设置perlbrew,您希望为特定用途保持稳定,这可能很有用管理多个perls的方法:

 ~/$ perlbrew alias create perl-5.24.0 stable-cronperl
 ~/$ perlbrew list
 perl-5.8.9
 perl-5.10.1
 perl-5.24.0
 cperl-cperl-5.26.1
 stable-cronperl (5.24.0)
 perl-5.26.1

NB :但是,如果要使其可执行,则别名仅作为稳定的#! shebang锚点使用,可在脚本顶部使用:

#!/home/cronic/perl5/perlbrew/perls/stable-cronperl/bin/perl

您无法使用--with来引用别名,例如:

perlbrew exec --with stable-cronperl ~/smart_comments.pl

将此作为文档问题或错误报告在我的待办事项列表中。