系统命令在Perl和CGI下的行为如何

系统命令在Perl和CGI下的行为如何,perl,concurrency,cgi,Perl,Concurrency,Cgi,我在cgi下有一个Perl脚本,包含以下内容: system ("echo mystuff > myfile.txt") 如果我同时遇到两个请求,是两个请求都试图写入myfile,还是因为系统导致fork并暂停父进程直到子进程完成而被阻塞?使用传统CGI,您的两个请求将在两个不同的进程中运行。两者都无法阻挡对方。如果您运气不好(或有足够的流量),则竞赛条件可能会使myfile.txt的内容混乱。如果脚本并行执行两次,则它的两个实例都将调用system命令,并且echo的输出可能会混乱。这

我在cgi下有一个Perl脚本,包含以下内容:

system ("echo mystuff > myfile.txt")

如果我同时遇到两个请求,是两个请求都试图写入myfile,还是因为系统导致fork并暂停父进程直到子进程完成而被阻塞?

使用传统CGI,您的两个请求将在两个不同的进程中运行。两者都无法阻挡对方。如果您运气不好(或有足够的流量),则竞赛条件可能会使
myfile.txt的内容混乱。如果脚本并行执行两次,则它的两个实例都将调用
system
命令,并且
echo
的输出可能会混乱。这会在CGI下发生,或者直接在命令行中运行脚本。如果您不喜欢这样做,您可以使用类似这样的方法来确保一次只运行一个进程,但如果这样做,您应该非常小心。

这是遗留问题,似乎运行有效。阻止的唯一方法是群集;apache上没有限制实例数量的配置设置吗?这将/可能是罕见的情况?@paulj很可能有一个apache设置使apache运行CGI脚本的单个实例,但我认为这不是一个好主意。您自己处理阻塞的解决方案提供了更好的粒度。您也可以在bash中使用
flock
,例如
system(“flock/path/to/lockfile-echo-mystuff>myfile.txt”)
,但是perl解决方案的性能会更好。是的。一种解决方法是在每个脚本中写入一个唯一的文件,比如说
myfile.$$.txt
,其中用Perl和sh表示的
$$
,被当前进程id替换。