如何讓 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 ,簡單方便快捷。

本文分享自微信公衆號 - 一線碼農聊技術(dotnetfly)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章