【发布时间】:2014-02-25 01:28:46
【问题描述】:
我已经解决这个问题大约一周了,但我无处可去,所以我想寻求一些帮助。
我有一个 perl 脚本,我通过类似命令执行,通常以以下方式执行
nohup ./script.pl --param arg --param2 arg2 &
我通常同时运行大约 10 个来处理来自不同来源(通过参数指定)的相同类型的数据。该脚本运行良好,我可以看到 nohup.out 中所有内容的日志,并通过 ps 输出监控状态。该脚本还使用 sql 数据库来跟踪各种任务的状态,因此我可以跟踪某些源的完成情况。
但是,这工作量太大,所以我编写了一个包装脚本来自动执行脚本,这就是我遇到问题的地方。我想要和我完全一样的东西,但是是自动的。
getwork.pl 脚本运行 ps 并解析输出以找出有多少其他进程正在运行,如果它低于配置的阈值,它将查询数据库以查找最过时的源并启动脚本。
问题是启动的作业没有正常运行,有时它们会终止而没有任何错误消息,有时它们只是挂起并闲置,直到我杀死它们。
getwork 脚本查询 sql 并通过 sql 连接获取整个执行命令,因此在 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 包装脚本,所以现在 get work 脚本中有一个无限的外观,每 30 分钟执行一个函数。
我还尝试了执行命令的许多变体,包括将输出重定向到不同的文件等……似乎没有什么是一致的。任何帮助将不胜感激,因为我真的被困在这里......
编辑: 此外,我尝试在每个脚本中添加单独的日志记录,它会使用它的 PID ($$) 启动一个新的日志文件。那里也有一堆奇怪的东西,所有的日志文件都会被创建,但是一些进程会运行并写入文件,其他的只有一个空的文本文件,还有一些只有一两个日志条目。有时该进程仍然在运行,只是什么都不做,有时它会在日志中没有任何内容而死亡。我,直接在 shell 中运行命令总是有效的。
提前致谢
【问题讨论】: