如何让 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?=>{});如果你想退出程序,可以用如下兩種方式:
Ctrl + C
向程序發送 SIGTERM 信號
點評區
以我個人經歷,在 Linux 上部署 .net 程序,由于公司業務量不是特別大所以采用的是 docker swarm + Jenkins 去跑,正因為docker部署,也就無所謂什么后臺方式部署了????,當然原生部署我還是推薦下面兩種進程管理工具:
supervisord
這個是微軟官方推薦,官方文檔:http://supervisord.org/
pm2
nodejs專屬,當然也可以用在其他語言程序上,官方文檔:https://pm2.io/
我個人還是偏向于 pm2 ,簡單方便快捷。
總結
以上是生活随笔為你收集整理的如何让 dotnetcore 在 Linux 上后台运行?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 平台采用率的提升归功于开源
- 下一篇: 为什么 Linux 上的 Asp.NET