`Exception non gérée: System.ArgumentNullException: la valeur ne peut pas être null.` Erreur lors de l’exécution de` dotnet run` en utilisant un script de démarrage

J’essaie d’exécuter une application dotnet en utilisant dotnet run --configuration Release au démarrage / redémarrage du serveur système. J’utilise un script init.d pour obtenir la même chose.

Mon script de démarrage, situé dans /etc/init.d/myscript contient les éléments suivants:

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

Contenu de botScript.sh :

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

Lorsque mon serveur démarre ou redémarre, le script de démarrage est exécuté, mais l’ dotnet run ne dotnet run pas. Je reçois les erreurs suivantes:

 Unhandled Exception: System.ArgumentNullException: Value cannot be null. Parameter name: path1 at System.IO.Path.Combine(Ssortingng path1, Ssortingng path2, Ssortingng path3) at Microsoft.DotNet.ProjectModel.Resolution.PackageDependencyProvider.ResolvePackagesPath(Ssortingng 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(Ssortingng[] args, ITelemetry telemetryClient) at Microsoft.DotNet.Cli.Program.Main(Ssortingng[] args) 

Mais toutes les autres commandes fonctionnent bien dans ce script et même simplement exécuter dotnet fonctionne très bien aussi (je l’ai vérifié). C’est juste que l’ dotnet run ne dotnet run pas.

Oui, mais quand je lance les scripts, à la fois myscript et botScript.sh , une fois connecté à mon serveur, cela fonctionne sans erreur.

S’il vous plaît, quelqu’un peut-il m’aider à ce sujet?

Il existe évidemment un bogue dans PackageDependencyResolver , mais pour trouver une solution de contournement, considérez l’ordre dans lequel le dossier des packages est trouvé:

  1. global.json { "packages": "..." }
  2. NUGET_PACKAGES environnement NUGET_PACKAGES .
  3. {DefaultLocalRuntimeHomeDir}\packages

Votre code tombe jusqu’au cas n ° 3 ci-dessus. Pour contourner ce problème, créez une variable d’environnement appelée NUGET_PACKAGES pointe vers votre dossier de packages. Par exemple, dans botScript.sh :

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

Pour plus d'informations, voir PackageDependencyResolver.cs et PackageDependencyResolver.cs

Ne pas exécuter dotnet avec l’utilisateur root

S’il s’exécute à partir d’init.d, il est appelé avec l’ utilisateur root . Exécuter un programme avec root exposera votre machine à de graves problèmes de sécurité, en particulier avec le kernel .net qui est encore en plein développement et qui n’a donc pas encore été sécurisé.

Exécuter un service avec un utilisateur spécifique

Votre erreur est probablement due au fait que, pour root aucun répertoire n’est défini, mais lorsque vous l’exécutez manuellement, c’est avec votre user que le répertoire /home/user/.nuget/packages est défini.

  • De la documentation de base asp.net , vous pouvez configurer un service et spécifier un utilisateur qui exécutera dotnet
  • Utilisez simplement la commande su pour exécuter dotnet avec l’utilisateur spécifié

Utilisateurs superviseurs

Ici un extrait de superviseur conf pour mon propre site

/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 

Ne pas utiliser dotnet run dehors du développement / du débogage

Comme le dit dotnet --help , la commande run comstack et exécute un projet.

 run Comstacks and immediately executes a .NET project 

La compilation nécessitera des étapes supplémentaires, puis la puissance de calcul et donc du temps supplémentaire (à chaque fois qu’elle est exécutée, même le code ne change pas). Il faudra également restaurer et construire pour fonctionner (ce qui nécessite un utilisateur développeur normal). Il est également plus sujet aux pannes en raison des étapes supplémentaires qui pourraient échouer.

Au lieu de cela, exécutez la compilation une fois avec votre utilisateur développeur puis exécutez votre programme avec un utilisateur de service tel que www-data (qui est un type d'utilisateur intégré pour les sites Web).

 dotnet MyComstackdAssembly.dll