FileSystemWatcher in. NET core системный демон - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть. 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.");
        }
}



...