2

我正在尝试使用 cron 在我的 Ubuntu 服务器上运行 perl 脚本。我有 3 个 perl 脚本:

  • works.pl(从终端工作。作为 cron 作业工作)
  • failed.pl(从终端工作。作为 cron 作业失败)
  • functions.pl(我所有的共享函数都存储在这里)

我能想到的'works.pl'和'fails.pl'之间的唯一区别是'fails.pl'使用引用'functions.pl'的require()语句。“Fails.pl”不引用“functions.pl”。

额外信息

  • 我所有的 perl 脚本都位于同一个文件夹中,该文件夹位于我的公用文件夹之外。
  • 我所有的 perl 脚本都具有相同的权限 (740)。

有任何想法吗?我的用户级别是新手顺便说一句:-)

谢谢。

4

2 回答 2

3

require尝试在@INC数组中列出的目录之一中查找脚本。该数组通常包含当前目录.. 因此,如果您的当前目录是functions.pl位于其中的目录,那么运行fails.pl应该可以工作。

有两种方法可以实现:首先,在运行脚本之前更改目录,例如(cron条目示例)

5 12 * * * cd /home/user/path/to/script ; ./fails.pl

其次,告诉 Perl 在编译时在哪里可以找到你的脚本,方法是把它放在顶部附近fails.pl

BEGIN {
  unshift @INC, "/home/user/path/to/script";
};
于 2012-08-26T14:34:32.843 回答
0

莫里茨的回答是伟大而真实的,但我@INC的已经正确设置了;但是,我的情况不同。我的 perl 程序将在 CLI 上运行并且 cron 正在运行它,但它会默默地失败。

事实证明,我有:

my $width = `tput cols`; # breaks silently if run by CRON

在我的脚本中某处仅适用于终端。我将其更改为:

my $width = 160; # cron likes this
于 2019-05-22T04:34:24.563 回答