如何让 dotnetcore 在 Linux 上后台运行?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让 dotnetcore 在 Linux 上后台运行?相关的知识,希望对你有一定的参考价值。

咨询区

  • jjmcc

我遇到了几个奇怪的问题不知道如何去解决,场景是这样的,我的开发环境是 windows,每次发布代码时我会使用 vs 的 publish 发布代码,然后将代码copy到 AWS EC2 上,然后用 dotnet 命令将程序跑起来。


sudo dotnet application.dll

程序是可以跑起来,但我发现shell退出后程序也跟着退出了,我知道这是一种前台部署方式,但我希望程序在生产上以后台方式运行。

我找了一些资料发现可以用 nohup 实现,然后我改成如下代码:sudo nohup dotnet application.dll & ,命令执行后我发现了一些错误。


Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied. ---> System.IO.IOException: Bad file descriptor
   --- End of inner exception stack trace ---
   at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
   at Interop.CheckIo(Int64 result, String path, Boolean isDirectory, Func`2 errorRewriter)
   at System.ConsolePal.Read(SafeFileHandle fd, Byte[] buffer, Int32 offset, Int32 count)
   at System.ConsolePal.UnixConsoleStream.Read(Byte[] buffer, Int32 offset, Int32 count)
   at System.IO.StreamReader.ReadBuffer()
   at System.IO.StreamReader.ReadLine()
   at System.IO.SyncTextReader.ReadLine()
   at System.Console.ReadLine()
   at Application.Program.Main(String[] args) in F:\\Applications\\Server\\Program.cs:line 38

从错误信息看,上面的 F:\\Applications\\Server\\Program.cs 路径是我windows开发机的文件路径,我很奇怪的是为什么会在 nohup 上抛出这种异常,以前台的方式却不会抛出?

总的来说,想咨询下如何通过远程shell将application以后端的方式部署。

回答区

  • Tovich

这个异常的本质在于你用了 System.Console.ReadLine(),可以改造成如下方式:


        var cancellationTokenSource = new CancellationTokenSource();
        AppDomain.CurrentDomain.ProcessExit += (s, e) => cancellationTokenSource.Cancel();
        Console.CancelKeyPress += (s, e) => cancellationTokenSource.Cancel();
        await Task.Delay(-1, cancellationTokenSource.Token).ContinueWith(t =>
        {
        });

如果你想退出程序,可以用如下两种方式:

  1. Ctrl + C

  2. 向程序发送 SIGTERM 信号

点评区

以我个人经历,在 Linux 上部署 .net 程序,由于公司业务量不是特别大所以采用的是 docker swarm + Jenkins 去跑,正因为docker部署,也就无所谓什么后台方式部署了????,当然原生部署我还是推荐下面两种进程管理工具:

  1. supervisord

这个是微软官方推荐,官方文档:http://supervisord.org/

  1. pm2

nodejs专属,当然也可以用在其他语言程序上,官方文档:https://pm2.io/

我个人还是偏向于 pm2 ,简单方便快捷。

以上是关于如何让 dotnetcore 在 Linux 上后台运行?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 上的单实例 dotnetcore cli 应用程序

css如何设置能让一个div元素覆盖在div元素上后下面的div元素中的文字不显示出来

css如何设置能让一个div元素覆盖在div元素上后下面的div元素中的文字不显示出来

为啥安装了Deepin(深度)Linux在硬盘上后,运行很不稳定??极其容易死机?该版本不稳定吗??

引用 dotnetcore classlib 中的共享项目,并在 windows 和 linux 上构建工作

网站移植到linux上后常犯的错误