我一直在解决这个问题大约一个星期,我无处可去,所以我想伸出一些帮助。在Ubuntu上自动执行后台Perl执行
我有通过命令执行等,通常在
nohup ./script.pl --param arg --param2 arg2 &
I的方式通常具有这些约10运行同时处理相同类型的不同来源的数据的一个perl脚本(即通过参数指定)。脚本工作正常,我可以在nohup.out中看到所有日志,并通过ps输出监视状态。该脚本还使用sql数据库来跟踪各种任务的状态,因此我可以跟踪某些源的完成情况。
但是,这是工作太多,所以我写了一个包装脚本来自动执行脚本,这是我在哪里遇到了问题。我想要的东西和我的完全一样,但是是自动的。
getwork.pl脚本运行ps并分析输出以找出有多少其他进程正在运行,如果它低于配置的阈值,它将查询数据库以获取最新的源并启动脚本。
的问题是拉开序幕作业运行不正常,有时他们终止没有任何错误消息,有时他们只是挂和闲置,直到我杀了他们。
网络脚本通过sql concatanation查询sql并获取整个执行命令,所以在sql查询中,我正在做类似CONCAT('nohup ./script.pl --arg',param1,'--arg2' ,param2,'&')来获取命令字符串。
我用尽了一切办法让这些拉开序幕,我一直在使用系统()尝试过,但再次,一些工作揭开序幕,有的没有,有时卡住,有时作业启动,然后内死亡分钟。如果我采用了我用来开始工作的确切命令并在bash中运行它,它可以正常工作。
我试图也用管道命令状
open my $ca, "| $command" or die ($!);
print $ca $command;
close $ca;
该工程只是以及一切我已经试过。以前每30分钟通过cron执行的网络脚本,但是由于我需要另外一个shell包装脚本,所以我放弃了这个脚本,所以现在get work脚本中每隔30分钟执行一次函数就会有一个无限的外观。
我也试着执行命令的诸多变化,包括输出重定向到不同的文件,等等......似乎没有什么是一致的。任何帮助将不胜感激,因为我真的坚持在这里......
编辑: 另外,我试图在每个脚本中添加单独的日志记录,它会启动一个新的日志文件与它的PID($ $)。这里也有一些奇怪的地方,所有的日志文件都会被创建,但是其中一些进程会运行并写入文件,其他的只会有一个空文本文件,而有些则只有一个或两个日志条目。有时候这个过程仍然在运行,只是没有做任何事情,有时候它会在日志里没有任何东西。我直接在shell中运行命令总是可以工作的。
在此先感谢
谢谢,我会研究它。这里的根本问题是使用perl在后台执行进程。 – user2630270