我正在运行一个执行逻辑检查以及是否满足某些条件的 perl 脚本。示例:如果超过一定时间,我想在 linux 服务器上运行 system() 命令,该命令运行另一个脚本来更新该数据。更新文件的脚本需要 10-15 秒,它必须通过当前的文件数量,但在每月的高峰时段可能长达 30 秒。
我希望 perl 脚本运行,如果它必须运行 system() 命令,我不希望它在完成脚本的其余部分之前等待 system() 完成。解决此问题的最佳方法是什么?
谢谢
系统在 shell 中运行命令,因此您可以使用所有 shell 功能,包括作业控制。因此,只需在命令末尾粘贴 & 即可:
system "sleep 30 &";
由于出版日期,不打算成为双关语,但要小心僵尸!这有点棘手,有关详细信息,请参阅perlipc。但是,据我了解您的问题,您不需要维护更新程序和调用程序进程之间的任何关系。在这种情况下,“一劳永逸”会更容易:
use strict;
use warnings qw(all);
use POSIX;
# fork child
unless (fork) {
# create a new session
POSIX::setsid();
# fork grandchild
unless (fork) {
# close standard descriptors
open STDIN, '<', '/dev/null';
open STDOUT, '>', '/dev/null';
open STDERR, '>', '/dev/null';
# run another process
exec qw(sleep 10);
}
# terminate child
exit;
}
在这个例子中,sleep 10
不再属于进程组,所以即使杀死父进程也不会影响子进程。
在http://aaroncrane.co.uk/talks/pipes_and_processes/paper.html上有一个关于从 Perl 运行外部程序(包括运行后台进程)的很好的教程