是否可以使用perls system
命令的arrays版本(即,将第一个元素作为命令,将其余数组作为cmd参数的版本),同时也使用Linux产生新的进程,以便system
命令立即返回例如运行一个像这样的命令:
mycmd arg1 arg2 &
我尝试过使用system( ('mycmd', 'arg1', 'arg2', '&') )
但它只是将字符理解为第三个参数。
我知道我可以将整个命令作为标量传递给system
但是我特别想知道是否可以使用数组版本,因为此命令的参数将源自CGI脚本中的用户选项。
shell命令的一部分告诉shell在后台运行进程,因此使用system
的multi-arg形式绕过shell是没有意义的。
解决方案1:使用String :: ShellQuote引用。
use String:ShellQuote qw( shell_quote ); system(shell_quote('mycmd', 'arg1', 'arg2').' &');
解决方案2:使用shell插值引用。
system('sh', '-c', '"$@" &', 'sh', 'mycmd', 'arg1', 'arg2');
解决方案3:自己在后台启动程序。
use IPC::Open3 qw( open3 ); { open(local *CHILD_IN, '<', '/dev/null') or die $!; local $SIG{CHLD} = 'IGNORE'; open3( '<&CHILD_IN', '>&STDOUT', '>&STDERR', 'mycmd', 'arg1', 'arg2', ); }
既然你对执行的程序的命运没有兴趣,你可以使用fork / exec。 而你在Linux上允许使用$SIG{CHLD} = 'IGNORE'
来避免等待子进程。
sub background { local $SIG{CHLD} = 'IGNORE'; # fork and then exec if we are the child exec(@_) or die($!) unless fork; } background( 'mycmd', 'arg1', 'arg2' );