Получить процесс, выполняемый MONO в GNU/Linux

Я использую MONO для выполнения приложения. Использование команды ps показывает либо имя процесса MONO, либо CLI. Как я могу получить имя приложения, выполняемого MONO?

Пример: моно myApp.exe

Я хочу знать, выполняется ли myApp.exe в данный момент. Наконец, я хочу сделать эту проверку программно.

Ваше здоровье.


person LuckyLuke    schedule 15.10.2014    source источник


Ответы (3)


Обычно вы запускаете свою программу из сценария оболочки, и там вы можете использовать флаг -a для выполнения:

#!/bin/bash
exec -a VisibleName mono program.exe
person lupus    schedule 15.10.2014
comment
Привет, спасибо, но у меня не работает. При подключении через Telnet №1 я воспользовался вашим предложением. В Telnet Connection #2 я не вижу VisibleName. Я просто вижу MONO в списке процессов. Что происходит не так? Ваше здоровье - person LuckyLuke; 15.10.2014
comment
Привет, я понял. Мне нужно использовать ps -ef, чтобы увидеть видимое имя. Теперь мне нужно проверить, как мое моно-приложение также может получить доступ к visibleName. (это приложение должно проверить, работает ли мое основное приложение. Если мое основное приложение остановило выполнение, я хочу запустить его снова автоматически) - person LuckyLuke; 15.10.2014
comment
Привет, моя цель - иметь чистое решение .NET/MONO. (без собственных библиотек DLL и без конвейерной передачи вывода PS -ef) Поскольку .NET/MONO не поддерживает предоставление visibleName, исходное решение все еще остается вариантом. Но еще раз 100x спасибо за ваше предложение. Ваше здоровье - person LuckyLuke; 15.10.2014

Вот решение, в котором используются функции .NET/MONO (нет необходимости вызывать собственные библиотеки DLL или передавать вывод оболочки):

  • Перечислите все процессы.
  • Если имя процесса содержит MONO или CLI, прочитайте командную строку этого процесса.
  • Командная строка должна содержать всю необходимую информацию для идентификации вашего приложения.

     public static int process_count(string application_name)
    {
        int rc = 0;
        string cmdline = "";
    
        Process[] processlist = Process.GetProcesses();
    
        foreach (Process p in processlist)
        {
    
            cmdline = "";
    
            //Console.WriteLine("PID : " + theprocess.Id + " " + theprocess.ProcessName);
    
            if (p.ProcessName.Contains("mono"))
            {
                Console.WriteLine("PID : " + p.Id + " " + p.ProcessName + " " + p.MainModule.FileName);
                cmdline = File.ReadAllText("/proc/" + p.Id.ToString() + "/cmdline");
                Console.WriteLine("CMDLINE : "+cmdline);
            }
    
            if (p.ProcessName.Contains("cli"))
            {
                Console.WriteLine("PID : " + p.Id + " " + p.ProcessName + " " + p.MainModule.FileName);
                cmdline = File.ReadAllText("/proc/" + p.Id.ToString() + "/cmdline");
                Console.WriteLine("CMDLINE : " + cmdline);
            }
    
    
            if (cmdline.Contains(application_name))
            {
                Console.WriteLine("Found existing process: {0} ID: {1}", p.ProcessName, p.Id);
                rc++;
            }
        }
        return (rc);
    }
    

Как это сделать вручную:

  • вызовите ps -e, чтобы получить все процессы MONO или CLI
  • Посмотрите PID, например. 2845
  • Показать командную строку: cat /proc/2845/cmdline

Примечание для новичков: этот подход не предназначен для ОС Windows, поскольку он не поддерживает концепцию файловой системы /proc.

Ваше здоровье

person LuckyLuke    schedule 15.10.2014
comment
если моно приложение работает в фоновом режиме (как составной процесс), имя процесса равно mono-sgen, даже если вы запускаете его как моно myApp.exe - person Dima; 18.03.2015

Посмотри на

getting-mono-process- информация

Решение использует тот же подход к чтению /proc, но имеет больше возможностей.

Ваше здоровье

person LuckyLuke    schedule 16.10.2014