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