单实例 .NET Core 应用程序(或使 crontab 仅运行我的应用程序的 1 个实例)

Sup*_*JMN 5 .net c# linux cron .net-core

我想使用crontab在 Linux 中按计划执行 .NET Core 应用程序。这是一个长时间运行的操作,如果前一个执行尚未完成我不希望运行另一个实例。换句话说,我不希望crontab在给定时间执行多个 .NET Core App 实例。

有什么办法可以避免吗?我不想修改我的应用程序的代码。也许 crontab 有一个选项可以避免并发。我不是 Linux 专家(还):)

xne*_*neg 8

对于那些想要从代码中检查实例的人,您可以像这样使用命名互斥锁

const string mutexName = @"Global\appName";

var mutex = new Mutex(true, mutexName, out var createdNew);

if (!createdNew)
{
    Console.WriteLine(mutexName + " is already running! Exiting the application.");
    return;
}
Run Code Online (Sandbox Code Playgroud)

确保您的互斥锁名称以"Global\".


Sup*_*JMN 2

我终于使用了一个可用于 Raspbian 的小工具:flock

在我的 crontab 配置文件中,我放置了以下内容:

flock -n /tmp/importer.lock dotnet ~/Desktop/Importer/Plugin.Clm.Importer.Console.dll
Run Code Online (Sandbox Code Playgroud)

看来flock在运行时写入了一个锁定文件,并执行了命令。如果再次执行,并且锁定文件在那里,它就会失败。当它完成时,它释放该文件,允许再次调用它。

简而言之:它充当信号量:)