Демоны / подсказка к 1 задачке

    Прежде чем писать настоящих демонов попробуем начать с чего-то попроще.

    Надо понимать, что демон — это программа которая работает потенциально бесконечно долго и ждет указаний.

    Возможно самый близкий вам пример демона будет СУБД. То есть это некий сервис, у которого есть набор файлов, которыми он управляет, а если его хорошо попросить он с вами еще и какой-то информацией поделится. Просится оно через ваш любимый sql.

    В этом задании мы должны реализовать микро-программку, которая должна мониторить файлик и при изменении содержимого файла записывать в этот же файл ответ.

    Писать будем снова на C#. Тут я не буду все расписывать. А просто расскажу вам про те инструменты, которые понадобятся для работы.

    Первое что нам понадобится это механизм мониторинга изменений файлов. В линуксе такой механизм реализуется через модуль ядра inotify. А в C# есть замечательный класс который называется FileSystemWatcher, который как раз есть обертка вокруг этого самого inotify

    Работать с ним достаточно просто. Вы указываете папку, в которой хотите мониторить изменения файлов. И прописываете реакции на соответствующие события.

    using System;
    using System.IO;
    
    namespace daemon
    {
        class Program
        {
            static void Main(string[] args)
            {
                // указываем папку для отслеживания
                using var watcher = new FileSystemWatcher(@"/home/m");
            
                // чего мониторим
                watcher.NotifyFilter = NotifyFilters.Attributes
                     | NotifyFilters.CreationTime
                     | NotifyFilters.DirectoryName
                     | NotifyFilters.FileName
                     | NotifyFilters.LastAccess
                     | NotifyFilters.LastWrite
                     | NotifyFilters.Security
                     | NotifyFilters.Size;
            
                // конкретный файл мониторим через Filter
                watcher.Filter = "file.txt"; 
                
                // реакция на изменение
                watcher.Changed += OnChanged;
                watcher.EnableRaisingEvents = true; // ожидаем что watch будет генерить события
            
                // watcher создаст отдельный поток в котором будет обрабатываться события 
                // пока юзер на выйдет из программы нажав Enter
                Console.WriteLine("Нажмите Enter для выхода");
                Console.ReadLine();
            }
    
            private static void OnChanged(object sender, FileSystemEventArgs e)
            {
                if (e.ChangeType != WatcherChangeTypes.Changed)
                {
                    return;
                }
                Console.WriteLine($"Изменился: {e.FullPath}");
            }
        }
    }
    

    Теперь если в одной консоли запустить программу а в другой писать что-то в файл. Наш микродемон будет реагировать на изменения:

    Для того чтобы передать параметр вам понадобится снова CommandLineParser, так что не забудьте его подключить.

    Чтобы выполнять консольные команды прямо из C#, вам потребуется класс System.Diagnostics.Process работают с ним так

    using System;
    using System.Diagnostics;
    
    namespace daemon
    {
        class Program
        {
            static void Main(string[] args)
            {
                Process proc = new System.Diagnostics.Process ();
                proc.StartInfo.FileName = "apt"; // название утилиты или скрипта который будем запускать
                proc.StartInfo.Arguments = "show git"; // параметры для скрипта
                proc.StartInfo.UseShellExecute = false; // не использовать оболочку bash
                proc.StartInfo.RedirectStandardOutput = true; // для перехвата входного потока
                proc.Start (); // запускаем
    
                while (!proc.StandardOutput.EndOfStream) { // перехватываем вывод
                    Console.WriteLine (proc.StandardOutput.ReadLine ());
                }
            }
        }
    }
    

    в ответ он просто напишет то что перехватил из программы apt

    4.1

    Напишите программу, которая мониторит текстовый файл, в который любой пользователь может что-то написать и в ответ программа как-нибудь обработает ввод и запишет ответ прямо в файл.

    Программа должна принимать в качестве параметра путь к конфигурационному файлу. В конфигурационном файле должен быть прописан путь к файлу который будет мониторится программой.

    выбрать вариант