我尝试了以下内容并发现它可以正常工作。这是由非特权用户完成的。首先找出 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
时,cpanm
和PERL5LIB
都将安装在local::lib
下,除非您明确告诉他们不这样做。同样cpanm
似乎更适合与Perlbrew一起工作。
答案 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
将此作为文档问题或错误报告在我的待办事项列表中。