@MegaAnimeshnik

Как в линукс проверить, запущено ли net приложение?

Суть такая, есть два консольных приложения на net6, запускаются в ubuntu про крону, но одно приложение может работать несколько часов и я не хочу, чтобы в это время запускалось второе.
Пробовал
foreach (Process chk in Process.GetProcesses())
            {
                      if (chk.ProcessName.Contains("тут название"))
                      {
                         
                      } 
            }

но ProcessName в данном случае выдаёт dotnet.
MainModule.FileName так же выдаёт путь до dotnet, а не то что мне нужно.
Я так понимаю, если запускаю приложение как "dotnet название", то название это как бы аргумент запуска? Пробовал гуглить в этом ключе, но что то вообще ничего не нашел.

Подскажите куда копать.
  • Вопрос задан
  • 422 просмотра
Решения вопроса 2
Можно к примеру попробовать создать Mutex указав его имя.
Если удалось открыть - значит ещё не запущен второй экземпляр.
Если не удалось открыть - значит уже запущен.

Это по идее должно быть надёжнее, чем создавать файл.
Вот рабочий код:
using var globalMutex = new Mutex(false, "Global\\test_mx");
var result = globalMutex.WaitOne(1000);
Console.WriteLine(result ? "Owned" : "Not owned in 1s");
Console.ReadLine();

При попытке запустить сразу два экземпляра, в одном будет выведено: Owned, а в другом Not owned in 1s

Префикс Global\ обязателен. Без него мутекс будет локальный для текущего процесса.
Ответ написан
@rPman
Нет нужды создавать mutex или semaphore, исторически, хоть в windows хоть в linux для этого открывают файл (пустой, их называют .lock) в режиме SharedAccess NONE
https://learn.microsoft.com/ru-ru/dotnet/api/syste...
https://learn.microsoft.com/ru-ru/dotnet/api/syste...
FileMode = Create тогда файл будет автоматически создан если отсутствует и не выдаст ошибки если уже есть
FileAccess = Write чтобы файл можно было создать (если создать его заранее то хватит Read)
SharedAccess = None запрет на повторное открытие хоть на чтение хоть на запись


При попытке открыть такой файл повторно, будет выдана ошибка, при этом при закрытии процесса, операционная система следит за закрытием файлов автоматически.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
yarosroman
@yarosroman Куратор тега C#
C# the best
Process.StartInfo в этом свойстве есть ArgumentList. Там и смотрите параметры запуска.
А еще дотнет делает исполняемый (ELF) файл для запуска, можно через него запускать, а не через dotnet.
Ответ написан
jamakasi666
@jamakasi666 Куратор тега Linux
Просто IT'шник.
Тупо при запуске программы создай /tmp/procname.pid в которой впиши pid .
При запуске проверяешь наличие файла, смотришь в него и убеждаешься что по такому pid процесс живой.
При закрытие программы удаляешь файл.
Другими приложениями просто смотри наличии файла и то что процесс живой.
Ответ написан
Adler_lug
@Adler_lug
А как вы его компилировали?
У меня на домашнем "роутере" (мини комп с Убунту) телеграм бот на .net работает и никакого dotnet в процессах нет.
xFFGA4u.jpg
Ответ написан
@vitaly_il1
DevOps Consulting
Все уже давно придумали - pgrep или flock утилиты.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы