运行 使用 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 库。我的问题是:这是否完整且可移植?有没有更好的方法?
我看到了一些 bash 和 perl 脚本,它们应该为执行 Perl 脚本,但这似乎就足够了。欢迎任何建议!
编辑:从评论到问题,似乎我使用的是 Perlbrew 和 local::lib
的 "bad" 混合物。此处回答了确保库安装在特定 Perlbrew 版本中的方法:How do I install CPAN modules while using perlbrew?。当您使用 local::lib
时,cpan
和 cpanm
都将安装在 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
将此作为文档问题或错误报告在我的待办事项列表中。
我已经尝试了以下并发现它有效。这是由非特权用户完成的。首先找出你的 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 脚本,但这似乎就足够了。欢迎任何建议!
编辑:从评论到问题,似乎我使用的是 Perlbrew 和 local::lib
的 "bad" 混合物。此处回答了确保库安装在特定 Perlbrew 版本中的方法:How do I install CPAN modules while using perlbrew?。当您使用 local::lib
时,cpan
和 cpanm
都将安装在 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
将此作为文档问题或错误报告在我的待办事项列表中。