我试图运行一个dotnet应用程序使用dotnet run --configuration Release
在系统服务器启动/重新启动。 我正在使用一个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
,login到我的服务器后,它工作正常,没有任何错误。
请,谁能帮我解决这个问题?
PackageDependencyResolver
显然存在一个错误,但要找到解决方法,请考虑找到packages
文件夹的顺序:
{ "packages": "..." }
NUGET_PACKAGES
环境变量。 {DefaultLocalRuntimeHomeDir}\packages
你的代码一直在上面的例子#3中。 要解决此问题,请创建一个名为NUGET_PACKAGES
的环境变量,指向您的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
如果它从init.d运行,它将以root用户身份进行调用。 使用root运行程序会使您的机器遭受严重的安全问题,特别是在.net内核的情况下,这个问题仍然处于重大的发展阶段,所以目前还没有加强安全性。
您的错误可能是由于以下事实造成的:对于root
没有定义软件包目录,但是当您手动运行软件包时,它与您的user
定义了/home/user/.nuget/packages
目录。
su
命令来运行指定用户的dotnet 主管用户
这里是我自己的网站主管conf的摘录
/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
编译将需要额外的步骤,然后计算能力和额外的时间(每次运行,即使代码没有变化)。 它也将需要恢复和建立工作(这需要一个正常的开发人员用户)。 由于额外的步骤可能会失败,因此也更容易出错。
相反,运行你的开发人员用户编译一次,然后运行你的程序与服务用户,如万维网数据(这是一种内置用户的网站)
dotnet MyCompiledAssembly.dll