运行 使用 Perlbrew 时来自 crontab 的 Perl 脚本

Running a Perl script from crontab when you use 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 库。我的问题是:这是否完整且可移植?有没有更好的方法?

我看到了一些 bashperl 脚本,它们应该为执行 Perl 脚本,但这似乎就足够了。欢迎任何建议!

编辑:从评论到问题,似乎我使用的是 Perlbrew 和 local::lib 的 "bad" 混合物。此处回答了确保库安装在特定 Perlbrew 版本中的方法:How do I install CPAN modules while using perlbrew?。当您使用 local::lib 时,cpancpanm 都将安装在 PERL5LIB 下,除非您明确告诉他们不这样做。另外 cpanm 似乎更适合与 Perlbrew 一起工作。

脚本的 shebang (#!) 行应该指向 (perlbrew-installed) perl 它意味着在 运行 下。 (这应该作为安装脚本的一部分完成。)这就是您所需要的。

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

如果您已经使用 perlbrew 管理多个 perl 安装,最简单的方法是只使用 perlbrew exec 到 运行 您的脚本。 -q--with 选项允许您将多余的输出和 select 特定版本的 perl 静音为 运行 script/job。尝试类似的东西:

  • perlbrew exec perl -E 'say "Hello from $]\n"'(这将显示旧版本 (< 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(运行s 请求的 perl 版本的脚本)。
  • perlbrew exec -q --with 5.26.1 ~/script_from_heaven.pl(运行 脚本的 perl 版本在脚本的 shebang 行中被请求或硬编码)。

我倾向于显式设置 PERL5LIB 并仅在需要时使用 local::lib 或针对我专门安装 [=46 的某些用户或环境=]all $HOME/perl5/lib/perl5 中的 CPAN 模块(例如,完整的应用程序部署)。否则我发现 运行ning perl from perlbrew 非常方便。


一些我发现有帮助的事情:为perlbrew 环境设置一个alias,你想为特定用途保持稳定可以是管理多个 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: 但是别名只是 useful/useable 作为一个稳定的 #! shebang 锚点,如果你想在你的脚本顶部使用它们可执行:

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

您不能使用 --with 引用别名,例如:

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

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