如何避免Bash停止后台运行的.NET gRPC服务进程
解决Linux后台启动.NET gRPC服务器被Bash停止的问题
问题原因
你的gRPC服务器启动后会阻塞等待标准输入(比如Console.ReadLine()),当用&放到后台运行时,后台进程默认无法访问终端的标准输入,Bash会给进程发送SIGTTIN信号,导致进程被暂停。而ASP.NET Core服务器不会阻塞等待标准输入,它的主线程专注于处理请求事件循环,所以不会触发这个问题。
方案一:调整启动命令
- 重定向标准输入到空设备:启动时把标准输入导向
/dev/null,让进程读取输入时直接得到EOF,不会触发暂停信号:dotnet MyServer.dll < /dev/null & - 使用nohup命令:nohup会断开进程与当前终端的关联,默认把输出写入
nohup.out,彻底避免终端相关信号影响进程:nohup dotnet MyServer.dll & - 用终端复用工具:比如
screen或tmux,先启动工具创建会话,在会话内运行服务器,再分离会话,进程会在后台持续运行,不受当前终端关闭影响。
方案二:修改程序代码
- 移除等待标准输入的逻辑:如果服务器不需要从标准输入读取内容,直接删掉
Console.ReadLine()或类似阻塞读取输入的代码,进程就不会尝试访问终端输入。 - 在程序内重定向标准输入:如果必须保留现有代码结构,可以在服务器启动前添加以下代码,把标准输入重定向到空流,读取操作会直接返回:
Console.SetIn(new StreamReader(Stream.Null));
内容的提问来源于stack exchange,提问作者Georg
相关产品推荐
相关产品推荐

