我正在运行一个perl脚本,它执行逻辑检查并满足某些条件。示例:如果超过一定时间,我想在运行另一个更新该数据的脚本的Linux服务器上运行system()命令。更新文件的脚本需要10-15秒,并且必须通过当前的文件数量,但在月份的高峰时段最长可达30秒。
我希望运行perl脚本,如果必须运行system()命令,我不希望它在完成脚本的其余部分之前等待system()完成。最好的方法是什么?
谢谢
答案 0 :(得分:4)
系统在shell中运行命令,因此您可以使用所有shell功能,包括作业控制。所以只需坚持和在你的命令结束时:
system "sleep 30 &";
答案 1 :(得分:2)
使用fork
创建子进程,然后在子进程中使用exec
而不是系统调用其他脚本。 exec
将在单独的进程中执行您的其他脚本并立即返回,这将允许孩子完成。同时,您的父脚本可以完成它需要做的事情并退出。
检查this。它可能对你有帮助。
还有另一个很好的例子,说明如何在this页面上使用fork。
答案 2 :(得分:1)
由于出版日期不打算成为双关语,但要小心僵尸! 这有点棘手,详见perlipc。 但是,据我了解您的问题,您不需要维护updater和调用者进程之间的任何关系。在这种情况下,更容易“发射并忘记”:
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
不再属于进程组,因此即使终止父进程也不会影响子进程。
答案 3 :(得分:1)
在http://aaroncrane.co.uk/talks/pipes_and_processes/paper.html
上有一个关于从Perl运行外部程序(包括运行后台进程)的好教程