linux 系统写的 perl程序,单独可以执行,但放入crontab里后就不执行了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 系统写的 perl程序,单独可以执行,但放入crontab里后就不执行了相关的知识,希望对你有一定的参考价值。

linux 系统写的 perl程序,单独可以执行,但放入crontab里后就不执行了,写进sh后单独也可以执行,再把sh放入crontab后依然不能执行,权限放的都是777全开,进crontab日志里看有:
Nov 29 15:48:01 localhost CROND[5751]: (apache) CMD (/home/apache/bin/***.pl >> /home/apache/bin/log/log.txt &)
Nov 29 15:50:01 localhost CROND[5778]: (apache) CMD (/home/apache/bin/***.sh &)

有这两条记录,但应该是没有执行,因为就没有生成log.txt文档
而另有一个程序却是执行了,Nov 29 15:33:01 localhost CROND[5028]: (apache) CMD (/home/apache/bin/****.sh 2>&1 >/dev/null &)
比对了两个没有什么差别,请问问题出在什么地方
别人之前写的perl程序放在 sh里面也是可以执行的,我对比了我们两个的sh和perl程序,相关设置都是一样的,但就我的不被执行,

参考技术A 从你的记录看crontab执行是错误的,如果crontab设置没有问题的话,更大的可能是写的perl程序本身的问题,另外如果是写的perl程序也不推荐使用crontab方式来自动运行。
1,这个要看你perl程序中关联的lib库是use lib qw();方式明确指定的还是继承“./”的。
2,crond设置的运行用户是否和你在sh下运行一致?因为这个涉及到你写的perl程序是否有相关的执行权限,而文件执行权限777只是说其他用户可以执行,但不表示你的perl程序内部就允许执行。
参考技术B 这种问题基本上是由于权限的问题 参考技术C 显然,楼上没有遇到这个问题。。。。
这个问题是因为crontab都是用root账户执行的,所以需要加入一些你当前用户的环境变量。。。当时,我也折腾了很久,哎。。。。。。或者你切换到root,用root可以执行,你的这个crontab才能OK本回答被提问者采纳

使用Perl

如果你学习Perl的话,你作为一个系统管理员的技能将得到不可估量的提高 - 甚至只是一个关于它的知识。

什么是Perl

Perl是可用于系统管理的通用语言。实际上,它是由Larry Wall专门为此目的而创建的。我们以前见过的其他许多单独程序的例子都可以单独使用Perl来完成。本节并不是要详细解释如何使用Perl,也不应该被认为是Perl语言的教程。在使用Perl之前,您应该通过键入以下内容熟悉它:

码:

perldoc perlintro

这将给你一个基本的教程。Perl几乎安装在所有标准的Linux发行版上,所以perldoc应该可用。

如果你使用perl进行系统管理,你会发现自己在管理员中使用了很多短perl表达式作为单行程序。这里有一些你可能想要学习,改变和适应,然后再使用的单行程式。

以下将打印一个文件的特定行,就像更多,更少或猫。

码:

perl -ne 'print if 1 .. 5' our_file

我们也可以选择不打印行:

码:

perl -ne 'print unless 1 .. 5' our_file

除非选项意味着不打印第1行到第5行。

使用perl单行程序的最好方法之一是作为sed的替代。下面是我们如何使用像sed这样的Perl的一个例子:

码:

perl -p -i.bkp -e 's/SCO/Satan/' SCO_news

在这里,我们在文件SCO_news中用单词“撒旦”代替了单词SCO,而且我们创建了一个备份文件。这是一个好主意,因为如果我们没有使用-i.bkp选项,我们将永远覆盖SCO_news文件。

我们也可以像awk一样使用Perl。这是一个例子

码:

ls -l | perl -lane 'print $F[+8]'

这将打印出文件的名称。这不是特别有用,因为我们可以通过键入ls -1来轻松完成这一操作。但是,如果我们添加一点点,它变得非常有用。

码:

ls -l|perl -lane 'print join " ",@F[5..8]'

这将打印出文件创建或上次修改的月份,年份和小时以及文件名。

这是另一个你可能会觉得有用的。如果你知道某人是个大写字母,他们可能会用大写字母命名他们的所有文件。这是一种使用perl将文件重命名为小写名称的方法。

码:

perl -e 'for (@ARGV) { rename , lc() ; }' *

该特定目录中的所有文件(*)将被重命名为小写的等价物。

如果你碰巧和我一样,而且你觉得你不必用花里胡哨的文字处理器写出你的想法,下面的这一行就可以派上用场了。我使用的拼写检查器,ispell,不会偶尔大写字母,应该是小写。当涉及到一个人的头衔时,我通常会搞得一团糟,一般地谈论他/她。(例如,克林顿总统或克林顿总统在1999年)这将打印文件中所有以首都开头的单词。如果你已经大写了一些不应该的东西,那么你可以改正。

码:

perl -ne 'push@w,/(b[A-Z]S*?b)/g;END{print"@w"}'

码:

perl -ne 'print "$1n" if /sto=<([^>]+)>.*?relay=(?!local,)/' /var/log/mail.log

码:

cat /proc/net/tcp |perl -lane '(undef,)=split ":",; print hex()."t".getpwuid() if '|sort -n|uniq -c

这非常重要。应该关闭不需要的端口。任何开放的端口都是不必要的入口的潜在来源。在这里,我们已经将我们的TCP端口读取到Perl,然后,正如我们前面看到的,我们对它们进行排序,并用uniq过滤掉任何重复的条目。

我们之前的一些例子是关于Apache Web服务器访问日志的。那么,这个团队还有另外一个。这是一个简单的单线程,从我们网站的访问次数最多到最少,为我们提供了“点击次数”。

码:

cat access | perl -ne 'print "$1n" if /GET (.*?) HTTP/'|sort|uniq -c|sort -nr|less

尽管不打算将其用于Web项目和其他编程工作,但在Perl中涉足一点也不失为一个好主意。您可以在perl站点获得更多信息:http//www.perl.org/

关注吕田论坛获取更多资讯


点击原文进行查阅吕田博客之旅


以上是关于linux 系统写的 perl程序,单独可以执行,但放入crontab里后就不执行了的主要内容,如果未能解决你的问题,请参考以下文章

在linux下的如何将perl默认版本5.8.8升级为5.10

使用Perl

怎么把在windows系统下写的java程序放到Linux系统上执行

linux 系统下oracle 10G perl进程cpu占用100% ,这个进程有啥用?能关掉吗?会不会有啥影响?

用C语言编写的程序,能不能直接在Linux下运行?

linuxexpect命令不能用