【问题标题】:`Unhandled Exception: System.ArgumentNullException: Value cannot be null.` error while running `dotnet run` using a startup script`未处理的异常:System.ArgumentNullException:值不能为空。`使用启动脚本运行`dotnet run`时出错
【发布时间】:2016-11-26 08:50:15
【问题描述】:

我正在尝试在系统服务器启动/重新启动时使用 dotnet run --configuration Release 运行 dotnet 应用程序。我正在使用init.d 脚本来实现相同的目标。

我的启动脚本,位于/etc/init.d/myscript,包含以下内容:

#!/bin/sh
/home/user/myscripts/botScript.sh

botScript.sh的内容:

#!/bin/bash
cd /home/user/bot/
nohup dotnet run --configuration Release &

当我的服务器启动或重新启动时,启动脚本会被执行,但 dotnet run 不起作用。我收到以下错误:

Unhandled Exception: System.ArgumentNullException: Value cannot be null.
Parameter name: path1
   at System.IO.Path.Combine(String path1, String path2, String path3)
   at Microsoft.DotNet.ProjectModel.Resolution.PackageDependencyProvider.ResolvePackagesPath(String rootDirectory, GlobalSettings settings)
   at Microsoft.DotNet.Configurer.NuGetCacheSentinel.get_NuGetCachePath()
   at Microsoft.DotNet.Configurer.NuGetCacheSentinel.Exists()
   at Microsoft.DotNet.Configurer.DotnetFirstTimeUseConfigurer.ShouldPrimeNugetCache()
   at Microsoft.DotNet.Configurer.DotnetFirstTimeUseConfigurer.Configure()
   at Microsoft.DotNet.Cli.Program.ConfigureDotNetForFirstTimeUse(INuGetCacheSentinel nugetCacheSentinel)
   at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, ITelemetry telemetryClient)
   at Microsoft.DotNet.Cli.Program.Main(String[] args)

但所有其他命令在该脚本中都可以正常工作,甚至简单地运行dotnet 也可以正常工作(我已经检查过了)。只是dotnet run不行。

是的,但是当我运行脚本时,myscript 和 botScript.sh 在登录到我的服务器后,它工作正常,没有任何错误。

请问,谁能帮帮我?

【问题讨论】:

  • 我不明白为什么它被否决了
  • 顺便说一句,您是否收到警告“警告:未设置 HOME 环境变量。禁用 LTTng-UST 每用户跟踪。” ?
  • @Artiom 不,我刚刚收到上述错误。我还尝试分配 HOME 环境。变量为/home/user 仍然出现相同的错误。
  • 目前有两张票与此问题相关:github.com/dotnet/cli/issues/354 和 github.com/dotnet/cli/issues/2385
  • 您成功解决了这个问题吗?

标签: .net linux debian startup init


【解决方案1】:

PackageDependencyResolver 中显然存在错误,但要找到解决方法,请考虑找到 packages 文件夹的顺序:

  1. global.json { "packages": "..." }
  2. NUGET_PACKAGES 环境变量。
  3. {DefaultLocalRuntimeHomeDir}\packages

您的代码一直下降到上面的案例 #3。要解决此问题,请创建一个名为 NUGET_PACKAGES 的环境变量,指向您的包文件夹。例如在botScript.sh:

#!/bin/bash
cd /home/user/bot/
export NUGET_PACKAGES="/home/user/.nuget/packages" # <=== 
nohup dotnet run --configuration Release &

有关详细信息,请参阅PackageDependencyResolver.cs 和 PackageDependencyResolver.cs

【讨论】:

    【解决方案2】:

    不要以 root 用户运行 dotnet

    如果它从 init.d 运行,它由 root 用户调用。 使用 root 运行程序会使您的计算机面临严重的安全问题,尤其是 .net 内核,它仍在大力开发中,因此尚未安全性得到加强。

    使用特定用户运行服务

    您的错误可能是因为root 没有定义包目录,但是当您手动运行它时,它与您的user 定义了/home/user/.nuget/packages 目录有关。

    • 从asp.net core documentation,您可以设置服务并指定将运行 dotnet 的用户
    • 只要使用su命令就可以用指定的用户运行dotnet

    主管用户

    这里是我自己网站的主管配置文件的摘录

    /etc/supervisor/conf.d/mysite.conf:

    [program:mysite]
    command=/usr/bin/dotnet /var/www/mysite/MySite.dll
    directory=/var/www/mysite
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/mysite.err.log
    stdout_logfile=/var/log/mysite.out.log
    environment=ASPNETCORE_ENVIRONMENT=Production
    user=www-data <=== SPECIFY A USER HERE
    stopsignal=INT
    

    不要在开发/调试目的之外使用dotnet run

    正如dotnet --help 所说,run 命令编译并执行一个项目。

    run           Compiles and immediately executes a .NET project
    

    编译需要额外的步骤,然后是计算能力和额外的时间(每次运行,即使代码没有变化)。它还需要恢复和构建才能工作(这需要普通的开发人员用户)。由于可能会失败的附加步骤,它也更容易失败。

    改为与您的开发人员用户一起运行一次编译,然后与 www-data 之类的服务用户(这是网站的一种内置用户)一起运行您的程序

    dotnet MyCompiledAssembly.dll
    

    【讨论】:

    • 我运行主管以监控应用程序。我应该以特定用户身份运行主管以修复上述异常吗?
    • @Artiom 我已经添加了我使用的配置
    • 这很好。好答案。 +100 来自我。
    • 计算机上存在 www-data,但缺少 /home/www-data。我错过了什么?
    • @Artiom www-data 是一个特殊用户,其主页位于 /var/www 中,但无论如何你为什么需要进行恢复?你想重新编译你的程序吗?
    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多