Демоны / подсказка к 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

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

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

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