2013-10-21 42 views
4

我有一個小的perl腳本,它在cPanel中使用system()運行/scripts/pkgacct命令。代碼看起來像這樣;使用system(),exec()或反引號運行/ 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命令後執行的其餘語句?

+0

系統和執行是相似但不相同的,系統的行爲是運行命令並等待它完成。 exec的行爲是運行該命令並退出當前的Perl代碼。所以在這種情況下,你會想要使用系統。至於實際備份的內容,我不明白Perl是如何搞砸的。如果你在Perl之外自己運行/ scripts/pkgacct會發生什麼? –

+0

由CLI自己運行'/ scripts/pkgacct'因爲可以備份包括數據庫在內的所有內容(由於skip參數--skiphomedir而導致的主目錄除外)。另外,如果我在一個單獨的perl腳本中將'/ scripts/pkgacct'作爲一行運行(即除pkgacct外沒有其他語句),它將按預期工作。 – rahuL

+0

你在哪裏設置你的perl腳本中的$ acc_name的值?您的第一份印刷聲明是否顯示$ acc_name的正確值?由於它是雙重的,所以在發送到他們的系統之前將被插入。 –

回答

0

嘗試使用系統,就像這樣:

系統( '/腳本/ pkgacct', '--skiphomedir', '--nocompress',$ acc_name, '/ my_backup');

我發現系統在分解命令和參數時效果最好。

0

嘗試使用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/']; 
相關問題