2016-09-19 65 views
1

下,我有一個Perl腳本下運行CGI下列要求:如何系統命令表現Perl和CGI

system ("echo mystuff > myfile.txt") 

如果我打這兩個請求同時,一舉兩得請求嘗試寫入MYFILE,或做它會阻止系統導致分叉並暫停父進程,直到子結束爲止?

+0

是的。一種解決方法是在每個腳本中寫入一個獨特的文件,比如'myfile. $$。txt',其中'$$' - 在Perl和sh中 - 被當前進程ID替換。 – mob

回答

2

如果腳本並行執行兩次,那麼它的兩個實例都會調用system命令,並且echo的輸出可能會出現亂碼。這發生在CGI下,或者直接在命令行中運行腳本。如果你不喜歡那樣,你可以使用像flock這樣的東西來確保一次只運行一個進程,但是如果你這樣做,你應該非常小心。

+0

這是遺留問題,似乎似乎運行正常。阻止的唯一方法是羣; apache上沒有配置設置可能會限制實例的數量?它會/可能會很少發生? – paulj

+0

@paulj很可能有一個apache設置讓Apache運行一個CGI腳本的單個實例,但我不認爲這是個好主意。您自己處理阻塞的解決方案可提供更好的粒度。你也可以在bash中使用'flock',例如'system(「flock/path/to/lockfile echo mystuff> myfile.txt」)'但perl解決方案會有更好的性能。 – redneb

1

使用傳統的CGI,您的兩個請求將在兩個不同的進程中運行。兩者都不會阻止對方。如果您不幸(或者擁有足夠的流量),競爭條件可能會影響myfile.txt的內容。