У меня есть. NET core 3.1 "рабочий" сервис (например, https://devblogs.microsoft.com/dotnet/net-core-and-systemd/).
Я использую класс FileSystemWatcher для поиска новых файлов в папке и запустить процесс для них. Служба работает как положено в Windows (как служба и работает как консольная программа), и она работает в linux при запуске непосредственно в Терминале.
При запуске в качестве демона (sudo systemctl start {myservice}.service
) он запускается, но не отслеживает папку.
Ниже моего рабочего класса.
Если я увеличу максимальное количество часов в системе, это будет работать.
sudo nano /etc/sysctl.conf
fs.inotify.max_user_watches = 1048576
Любые идеи, почему мне нужно увеличить максимальное количество часов? обратите внимание, что папка, которую я отслеживаю, содержит только около 100 файлов (по умолчанию около 8192 часов).
Меня беспокоит то, что в классе есть что-то, чего я не понимаю, поэтому я устанавливаю большое число для максимального количества часов, не зная, когда это будет достигнуто или почему. Кроме того, FileSystemWatcher, похоже, совершенно не знает, что происходит, поэтому моя программа ничего не может с этим поделать, потому что не знает.
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private FileSystemWatcher _fileSystemWatcher;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
public override Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Service startup.");
fileSystemWatcher = new FileSystemWatcher(@"/myfolder/myfolder2");
_fileSystemWatcher.IncludeSubdirectories = true;
_fileSystemWatcher.Filter = "*.xml";
_fileSystemWatcher.Created += (e, args) => _logger.LogWarning("StartAsync watcher: {0}", args.FullPath);
_fileSystemWatcher.EnableRaisingEvents = true;
return base.StartAsync(cancellationToken);
}
public override async Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Stopping Service");
await base.StopAsync(cancellationToken);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Service Execute.");
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Keep alive: {time}", DateTimeOffset.Now);
await Task.Delay(5*60*1000, stoppingToken);
}
_logger.LogInformation("Service Execute stopped.");
}
}