Linux下如何让dotnet test命令在后台正常运行不自动停止
dotnet test 后台运行无输出/自动停止解决方案
问题原因
该现象由两个.NET运行时的默认行为叠加导致:
- dotnet test 默认会检测标准输入流、尝试读取交互输入,后台运行的进程没有控制终端权限,尝试读取终端时会触发系统
SIGTTIN信号,被系统强制暂停运行 - 控制台输出默认开启缓冲机制,只有缓冲区满或者进程主动刷新时才会写入日志文件,前台运行时刷新策略更激进,因此切前台后日志立刻出现
可用解决方法
方法1:最简后台运行(当前终端会话内有效)
添加禁用交互参数+重定向标准输入到空设备,直接用&后台运行即可:
dotnet test --no-interaction --filter "FullyQualifiedName~GenerateTransactions" < /dev/null >> dotnet.log 2>&1 &
--no-interaction:禁用所有需要用户交互的提示逻辑,从根源避免读取输入的需求< /dev/null:将标准输入指向空设备,进程读输入会直接得到EOF,不会触发终端读取请求
方法2:关闭终端也不终止(适合手动执行场景)
用nohup包裹命令,会自动处理输入重定向、忽略终端挂断信号,关闭当前终端后进程仍会正常运行:
nohup dotnet test --no-interaction --filter "FullyQualifiedName~GenerateTransactions" >> dotnet.log 2>&1 &
方法3:完全脱离控制终端(适合脚本内调用)
用setsid给进程创建独立会话,完全脱离当前终端的任务管理体系,不会出现在当前shell的后台任务列表中:
setsid dotnet test --no-interaction --filter "FullyQualifiedName~GenerateTransactions" >> dotnet.log 2>&1
日志实时输出优化
如果需要日志实时写入文件不需要等待缓冲,添加环境变量禁用控制台输出缓冲即可:
DOTNET_LOGGING_CONSOLE_DISABLEBUFFERING=1 dotnet test --no-interaction --filter "FullyQualifiedName~GenerateTransactions" < /dev/null >> dotnet.log 2>&1 &
内容的提问来源于stack exchange,提问作者Alexander Todorov
相关产品推荐
相关产品推荐

