【发布时间】: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 的默认 roundcube 和 horde 数据库被备份。当我将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之后运行,您可以在子节点中使用fork、exec,在父节点中使用wait。