Я наконец понял, что происходит. Первоначальная структура метода Main в Program.cs была следующей. Этот код прекрасно работал при работе в Windows и Linux как автономный процесс, связанный с сеансом терминала. В Linux, как только завершится сеанс терминала, фоновая программа завершится, так как основной поток программы также будет завершен.
Когда программа запускалась как служба Linux, с ней не было связано ни одного терминального сеанса, поэтому Console.ReadLine()
не приводило бы к блокировке потока, и программа немедленно прекращала работу. Решение состояло в том, чтобы заменить Console.ReadLine()
некоторым кодом, который заставил бы поток блокироваться и оставаться в живых, чтобы могли выполняться фоновые потоки, управляемые Quartz.Net. Есть много разных способов сделать это, и есть множество обсуждений StackOverflow относительно «лучшего» способа сделать это. Моим простым решением было заменить Console.ReadLine
на Thread.Sleep(Timeout.Infinite)
. Это приводит к тому, что основной поток блокируется и остается в живых навсегда Обратите внимание, что с этим решением, если вы хотите иметь возможность вручную завершить программу, должен быть способ сделать это вне основного потока, так как он всегда спит.
**Original Code**
static void Main(string[] args)
{
_scheduler = InitializeQuartzScheduler();
_scheduler.ScheduleBackgroundJob<BackgroundJob1>(Yesterday.At(1, 30).AsPstToUtc(), 1.Hours());
_scheduler.ScheduleBackgroundJob<BackgroundJob2>(Yesterday.At(0, 10, 30).AsPstToUtc(), 10.Minutes());
...
_scheduler.ScheduleBackgroundJob<BackgroundJob7>(Yesterday.At(1, 45).AsPstToUtc(), 8.Hours());
_scheduler.ScheduleBackgroundJob<BackgroundJob8>(Yesterday.At(0, 10).AsPstToUtc(), 6.Hours());
Console.Readline();
}