我有一个运行在Linux(Ubuntu服务器16.04 LTS)上的. net核心2.0程序。
我正在尝试通过使用以下命令调用进程来关闭计算机:sudo shutdown -h now
,但当程序作为守护程序服务在后台运行时,关闭过程不起作用。
下面是代码:
var process = new Process
{
StartInfo =
{
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
UseShellExecute = false,
FileName = Environment.GetEnvironmentVariable("SHELL"),
Arguments = "-s"
},
EnableRaisingEvents = true
};
if (process.Start())
{
process.BeginErrorReadLine();
process.BeginOutputReadLine();
process.StandardInput.WriteLine("sudo shutdown -h now");
}
我的假设是服务作为一个单独的会话运行,所以它没有任何控制权。当应用程序作为Linux守护进程运行时,我如何让它关闭计算机?
3条答案
按热度按时间iqjalb3h1#
我建议更改代码,使用P/Invoke直接调用Linux的
reboot
函数,如果失败,这也会提供更多细节。虽然调用其他可执行文件来执行任务是Unix/Linux上的惯例(特别是从shell脚本),但. NET程序确实不适合,而且所需的代码非常脆弱(例如,您在
sudo
中看到的),特别是在. NET世界中,处理来自其他进程的标准IO(stdin
、stdout
、stderr
)非常困难。用法:
请注意,对
reboot()
的成功调用将永远不会返回。ivqmmu1c2#
另外,对于运行在Raspberry Pi上的.net核心,我们需要使用另一个答案,但请按照用户Tom的评论,将DllImport更改为:
然后关闭电源,我们可以调用:
或重新启动:
qaxu7uf23#
这在AWS EC2和Ubuntu服务器上工作,在守护进程中使用。只在那里测试过,在其他地方也可以工作。