我有一個小的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的默認roundcube
和horde
數據庫備份。當我將system()
替換爲exec""
時,腳本按預期運行,但在執行exec
後立即終止,即不執行perl腳本中的後續語句。使用反引號顯示與system()
相同的行爲 - 即不備份所有數據庫。
有人能告訴我我犯了什麼錯誤嗎?
或者,我怎樣才能得到在exec
命令後執行的其餘語句?
系統和執行是相似但不相同的,系統的行爲是運行命令並等待它完成。 exec的行爲是運行該命令並退出當前的Perl代碼。所以在這種情況下,你會想要使用系統。至於實際備份的內容,我不明白Perl是如何搞砸的。如果你在Perl之外自己運行/ scripts/pkgacct會發生什麼? –
由CLI自己運行'/ scripts/pkgacct'因爲可以備份包括數據庫在內的所有內容(由於skip參數--skiphomedir而導致的主目錄除外)。另外,如果我在一個單獨的perl腳本中將'/ scripts/pkgacct'作爲一行運行(即除pkgacct外沒有其他語句),它將按預期工作。 – rahuL
你在哪裏設置你的perl腳本中的$ acc_name的值?您的第一份印刷聲明是否顯示$ acc_name的正確值?由於它是雙重的,所以在發送到他們的系統之前將被插入。 –