【问题标题】:Making only one perl script could be run at the same time只能同时运行一个 perl 脚本
【发布时间】:2013-12-22 18:49:34
【问题描述】:

我有 5 个 perl 脚本,并且想确保如果有人运行其中一个脚本并同时尝试运行另一个脚本,那么第二个脚本将终止并显示另一个脚本正在运行的消息

我在其他 stackoverflow 上看到这种机制处理一个实例: What's the best way to make sure only one instance of a Perl program is running?

use Fcntl ':flock';
open my $self, '<', $0 or die "Couldn't open self: $!";
flock $self, LOCK_EX | LOCK_NB or croak "This script is already running";

我的问题是有一个选项可以构建某种机制来确保只有一个脚本在 Windows 上运行,而无需在所有脚本上锁定外部文件?

【问题讨论】:

  • 恕我直言,您最好的选择是使用所有程序共享的外部文件。第一个创建文件,只要它在那里,其他人要么等待或停止。
  • 我想过这个选项我只是想知道是否还有其他选项可以隐藏这个文件,比如使用内存映射文件:search.cpan.org/~leont/File-Map-0.61/lib/File/Map.pm 或任何其他想法
  • 这看起来只适用于分叉或线程。但是你说你有五个不同的程序,你想确保只有一个运行。我不认为 File::Map 可以在那里提供帮助。不同的程序(甚至可能不会同时运行)应该如何知道它们应该共享的内存位置以便检查?
  • 我只是想知道是否可以选择
  • 我认为使用锁定文件将是最好的方法。如果您不希望用户看到它,您可以设置隐藏标志,因为您在 Windows 中。我知道这并不完美,但这是一个好的开始。

标签: perl


【解决方案1】:

如果您有五个单独的脚本并且它们都不能同时运行,那么您需要某种方式来访问它们之间的共享数据源。该共享源告诉其中一个是否正在运行,并且正确管理可能非常棘手。如果您不喜欢锁机制,您可以尝试使用数据库、Redis 或类似的东西,但我看不出它的价值。如果您觉得使用flock 很笨拙,请将其提取到一个模块中,然后使用该模块或寻找其他方式来管理您的共享信息,例如锁定模式语句中的数据库“SELECT FOR UPDATE”。

我的问题:如果您不想锁定外部文件,这背后的原因是什么?如果我们知道这一点,我们或许能够更好地回答您的问题。

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 1970-01-01
    • 2016-05-05
    • 2011-04-27
    • 2022-10-16
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多