我想在Linux中使用crontab 按计划执行.NET核心应用程序。 这是一个长时间运行的操作, 如果之前的执行尚未完成 , 我不希望再运行另一个实例 。 换句话说,我不希望crontab在给定的时间执行我的.NET Core应用程序的多个实例。
有什么办法可以避免吗? 我不想修改我的应用程序的代码。 也许有一个crontab的选项,以避免并发。 我不是Linux专家(还):)
如果你想在你的程序中解决它,你可以遍历System.Diagnostics.Process.GetProcesses中的所有进程,并检查任何进程的可执行文件路径是否以你的文件名结尾。
[System.STAThread] static void Main(string[] args) { foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses()) { if (p.Mainmodulee.FileName.EndsWith("bla.exe", System.StringComparison.CurrentCultureIgnoreCase)) return; } [...] }
否则,让脚本在/ var / run中设置一个值,并检查该文件是否存在。 如果您的程序以任何方式退出,那么该文件将被删除。
另外,解决漫长的运行时间。 程序通常不会花那么长时间。 看起来像你做错了什么,除非你真的在处理数千兆字节的数据。
我终于使用了Raspbian的一个小工具: 群
在我的crontab配置文件中,我已经把这个:
flock -n /tmp/importer.lock dotnet ~/Desktop/Importer/Plugin.Clm.Importer.Console.dll
看来,flock在运行时写入一个锁文件,并执行该命令。 它再次执行,并且锁定文件在那里,它只是失败。 完成后,它将释放该文件,并允许再次调用该文件。
简而言之:它充当一个信号灯:)
也许把重复的检查在脚本中,而不是在程序中。
所以检查'ps -ef |的输出 grep myprogramname'在执行你的程序之前。