【问题标题】:Running /scripts/pkgacct using system(), exec() or backticks使用 system()、exec() 或反引号运行 /scripts/pkgacct
【发布时间】:2013-10-29 15:06:40
【问题描述】:

我有一个小的 perl 脚本,它使用 system() 在 cPanel 中运行 /scripts/pkgacct 命令。代码是这样的;

print  "\n/scripts/pkgacct --skiphomedir --nocompress $acc_name /my_backup\n\n";
system("/scripts/pkgacct --skiphomedir --nocompress $acc_name /my_backup");
my $bk_path = "/my_backup/cpmove-$acc_name.tar";
system("tar -xvf $bk_path -C /my_backup/");

当我运行脚本时,只有 cPanel 的默认 roundcubehorde 数据库被备份。当我将system() 替换为exec"" 时,脚本会按预期运行,但会在exec 执行后立即终止,即不执行perl 脚本中的后续语句。使用反引号显示与 system() 相同的行为 - 即不备份所有数据库。

谁能告诉我我犯了什么错误?

另外,我怎样才能让剩余的语句在exec 命令之后执行?

【问题讨论】:

  • System 和execute 类似但不一样,system 的行为是运行命令并等待它完成。 exec 的行为是运行命令并退出当前的 Perl 代码。因此,在这种情况下,您将需要使用 system.至于实际备份的内容,我看不出 Perl 是如何搞砸的。如果您在 Perl 之外单独运行 /scripts/pkgacct 会发生什么?
  • 从 CLI 自己运行 /scripts/pkgacct 可以正常工作,可以备份包括数据库在内的所有内容(由于跳过参数 --skiphomedir 而导致的主目录除外)。此外,如果我在单独的 perl 脚本中将 /scripts/pkgacct 作为单行运行(即除了 pkgacct 之外没有其他语句),它会按预期工作。
  • 你在 perl 脚本中在哪里设置 $acc_name 的值?您的第一个打印语句是否显示 $acc_name 的正确值?由于它在双引号中,因此将在发送到他们的系统之前进行插值。
  • @ChrisDoyle - 是的,确实如此。这就是添加 print 语句的目的。
  • 要让剩余的代码在exec 之后运行,您可以在子节点中使用forkexec,在父节点中使用wait

标签: perl backup exec cpanel


【解决方案1】:

尝试使用这样的系统:

system('/scripts/pkgacct', '--skiphomedir', '--nocompress', $acc_name, '/my_backup');

我发现当您像预期的那样分解命令和参数时,系统工作得最好。

【讨论】:

    【解决方案2】:

    尝试使用 IPC::Run (https://metacpan.org/pod/IPC::Run)。您的代码如下所示:

    use IPC::Run qw(run);
    
    print  "\n/scripts/pkgacct --skiphomedir --nocompress $acc_name /my_backup\n\n";
    run ['/scripts/pkgacct', '--skiphomedir', '--nocompress', $acc_name];
    my $bk_path = "/my_backup/cpmove-$acc_name.tar";
    run ['tar','-xvf',$bk_path,'-C','/my_backup/'];
    

    【讨论】:

      猜你喜欢
      • 2014-08-30
      • 2011-09-14
      • 1970-01-01
      • 2010-10-22
      • 2012-06-07
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多