Передача аргумента cmd запущенному процессу при завершении работы службы Windows
Я создаю windowservice, который запускает процесс, в котором я передаю несколько аргументов cmd в StartInfo.Arguments
, Это работает нормально, как и ожидалось.
Проблема заключается в том, что когда я останавливаю службу Windows, мне нужно сказать, чтобы работающая программа корректно завершила работу до остановки службы Windows. Потому что, если я просто убью процесс, программа не сохранит собранные данные. Программа, которую я запускаю, является Process Monitor, и она принимает следующую команду "/terminate"
,
Как я могу передать /terminate
аргумент, прежде чем моя служба Windows останавливается?
2 ответа
Мне удалось найти решение. в OnStop()
метод в службе, мне нужно было создать новый экземпляр Process Monitor и передать /Terminate
аргумент:
Process process = new Process();
process.FileName = "\Procmon.exe" ;
process.StartInfo.Arguments = "/AcceptEula /Terminate";
process.Start();
При этом он изящно останавливает все экземпляры Process Monitor.
Существует несколько способов приблизиться к этому решению, но вы можете сигнализировать о процессе, и в зависимости от того, что вы отправляете с этим сигналом, он должен выполнить свой код очистки. Как только он завершится, процесс, который его породил, должен сигнализировать о том, что он завершил код очистки и может завершить работу. Это, конечно, предполагает, что вы написали код как для службы Windows, так и для вызываемого процесса.
Вы можете попробовать именованные каналы ( https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-use-named-pipes-for-network-interprocess-communication)