2016-09-19 64 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的内容。