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é:
{ "packages": "..." }
NUGET_PACKAGES
environnement NUGET_PACKAGES
. {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
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é.
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.
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
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