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