1
0
mirror of https://github.com/Sonarr/Sonarr.git synced 2024-12-14 11:23:42 +02:00

fixed NzbDrone using 100% cpu when console not available.

This commit is contained in:
Keivan Beigi 2013-08-20 15:12:35 -07:00
parent e377e02db4
commit 75a46a3abe
9 changed files with 39 additions and 31 deletions

View File

@ -50,11 +50,9 @@ public void Route_should_call_uninstall_service_when_application_mode_is_uninsta
public void Route_should_call_console_service_when_application_mode_is_console() public void Route_should_call_console_service_when_application_mode_is_console()
{ {
Mocker.GetMock<IRuntimeInfo>().SetupGet(c => c.IsUserInteractive).Returns(true); Mocker.GetMock<IRuntimeInfo>().SetupGet(c => c.IsUserInteractive).Returns(true);
Mocker.GetMock<IConsoleService>().SetupGet(c => c.IsConsoleApplication).Returns(true);
Subject.Route(ApplicationModes.Interactive); Subject.Route(ApplicationModes.Interactive);
Mocker.GetMock<IConsoleService>().Verify(c => c.WaitForClose(), Times.Once());
Mocker.GetMock<INzbDroneServiceFactory>().Verify(c => c.Start(), Times.Once()); Mocker.GetMock<INzbDroneServiceFactory>().Verify(c => c.Start(), Times.Once());
} }

View File

@ -7,8 +7,6 @@ namespace NzbDrone.Common
{ {
public interface IConsoleService public interface IConsoleService
{ {
bool IsConsoleApplication { get; }
void WaitForClose();
void PrintHelp(); void PrintHelp();
void PrintServiceAlreadyExist(); void PrintServiceAlreadyExist();
void PrintServiceDoesNotExist(); void PrintServiceDoesNotExist();
@ -16,26 +14,18 @@ public interface IConsoleService
public class ConsoleService : IConsoleService public class ConsoleService : IConsoleService
{ {
public bool IsConsoleApplication public static bool IsConsoleAvailable
{ {
get { return Console.In != StreamReader.Null; } get { return Console.In != StreamReader.Null; }
} }
public void WaitForClose()
{
while (true)
{
Console.ReadLine();
}
}
public void PrintHelp() public void PrintHelp()
{ {
Console.WriteLine(); Console.WriteLine();
Console.WriteLine(" Usage: {0} <command> ", Process.GetCurrentProcess().MainModule.ModuleName); Console.WriteLine(" Usage: {0} <command> ", Process.GetCurrentProcess().MainModule.ModuleName);
Console.WriteLine(" Commands:"); Console.WriteLine(" Commands:");
Console.WriteLine(" /{0} Install the application as a Windows Service ({1}).",StartupArguments.INSTALL_SERVICE, ServiceProvider.NZBDRONE_SERVICE_NAME); Console.WriteLine(" /{0} Install the application as a Windows Service ({1}).", StartupArguments.INSTALL_SERVICE, ServiceProvider.NZBDRONE_SERVICE_NAME);
Console.WriteLine(" /{0} Uninstall already installed Windows Service ({1}).",StartupArguments.UNINSTALL_SERVICE, ServiceProvider.NZBDRONE_SERVICE_NAME); Console.WriteLine(" /{0} Uninstall already installed Windows Service ({1}).", StartupArguments.UNINSTALL_SERVICE, ServiceProvider.NZBDRONE_SERVICE_NAME);
Console.WriteLine(" /{0} Don't open NzbDrone in a browser", StartupArguments.NO_BROWSER); Console.WriteLine(" /{0} Don't open NzbDrone in a browser", StartupArguments.NO_BROWSER);
Console.WriteLine(" <No Arguments> Run application in console mode."); Console.WriteLine(" <No Arguments> Run application in console mode.");
} }

View File

@ -21,6 +21,7 @@ public interface IProcessProvider
bool Exists(string processName); bool Exists(string processName);
ProcessPriorityClass GetCurrentProcessPriority(); ProcessPriorityClass GetCurrentProcessPriority();
Process Start(string path, string args = null, Action<string> onOutputDataReceived = null, Action<string> onErrorDataReceived = null); Process Start(string path, string args = null, Action<string> onOutputDataReceived = null, Action<string> onErrorDataReceived = null);
Process SpawnNewProcess(string path, string args = null);
} }
public class ProcessProvider : IProcessProvider public class ProcessProvider : IProcessProvider
@ -86,6 +87,8 @@ public void OpenDefaultBrowser(string url)
process.Start(); process.Start();
} }
public Process Start(string path, string args = null, Action<string> onOutputDataReceived = null, Action<string> onErrorDataReceived = null) public Process Start(string path, string args = null, Action<string> onOutputDataReceived = null, Action<string> onErrorDataReceived = null)
{ {
@ -147,6 +150,27 @@ public Process Start(string path, string args = null, Action<string> onOutputDat
return process; return process;
} }
public Process SpawnNewProcess(string path, string args = null)
{
if (OsInfo.IsMono && path.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase))
{
args = path + " " + args;
path = "mono";
}
Logger.Info("Starting {0} {1}", path, args);
var startInfo = new ProcessStartInfo(path, args);
var process = new Process
{
StartInfo = startInfo
};
process.Start();
return process;
}
public void WaitForExit(Process process) public void WaitForExit(Process process)
{ {
Logger.Trace("Waiting for process {0} to exit.", process.ProcessName); Logger.Trace("Waiting for process {0} to exit.", process.ProcessName);

View File

@ -1,4 +1,5 @@
using System; using System;
using NzbDrone.Common;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Host; using NzbDrone.Host;
@ -12,15 +13,19 @@ public static void Main(string[] args)
{ {
Bootstrap.Start(new StartupArguments(args), new ConsoleAlerts()); Bootstrap.Start(new StartupArguments(args), new ConsoleAlerts());
} }
catch (TerminateApplicationException) catch (TerminateApplicationException)
{ {
} }
catch (Exception e) catch (Exception e)
{ {
System.Console.WriteLine(e.ToString()); System.Console.WriteLine(e.ToString());
} }
System.Console.WriteLine("Press enter to exit...");
System.Console.ReadLine(); if (ConsoleService.IsConsoleAvailable)
{
System.Console.WriteLine("Press enter to exit...");
System.Console.ReadLine();
}
} }
} }
} }

View File

@ -133,7 +133,6 @@
<Compile Include="MediaFileTests\EpisodeImportTests\FreeSpaceSpecificationFixture.cs" /> <Compile Include="MediaFileTests\EpisodeImportTests\FreeSpaceSpecificationFixture.cs" />
<Compile Include="MediaFileTests\RenameEpisodeFileServiceFixture.cs" /> <Compile Include="MediaFileTests\RenameEpisodeFileServiceFixture.cs" />
<Compile Include="MediaFileTests\UpgradeMediaFileServiceFixture.cs" /> <Compile Include="MediaFileTests\UpgradeMediaFileServiceFixture.cs" />
<Compile Include="MediaFileTests\EpisodeImportTests\NotExistingFileSpecificationFixture.cs" />
<Compile Include="MediaFileTests\ImportApprovedEpisodesFixture.cs" /> <Compile Include="MediaFileTests\ImportApprovedEpisodesFixture.cs" />
<Compile Include="MediaFileTests\EpisodeImportTests\UpgradeSpecificationFixture.cs" /> <Compile Include="MediaFileTests\EpisodeImportTests\UpgradeSpecificationFixture.cs" />
<Compile Include="MediaFileTests\EpisodeImportTests\NotSampleSpecificationFixture.cs" /> <Compile Include="MediaFileTests\EpisodeImportTests\NotSampleSpecificationFixture.cs" />

View File

@ -227,7 +227,6 @@
<Compile Include="MediaFiles\EpisodeImport\ImportApprovedEpisodes.cs" /> <Compile Include="MediaFiles\EpisodeImport\ImportApprovedEpisodes.cs" />
<Compile Include="MediaFiles\EpisodeImport\Specifications\NotInUseSpecification.cs" /> <Compile Include="MediaFiles\EpisodeImport\Specifications\NotInUseSpecification.cs" />
<Compile Include="MediaFiles\EpisodeImport\Specifications\FreeSpaceSpecification.cs" /> <Compile Include="MediaFiles\EpisodeImport\Specifications\FreeSpaceSpecification.cs" />
<Compile Include="MediaFiles\EpisodeImport\Specifications\NotExistingFileSpecification.cs" />
<Compile Include="MediaFiles\EpisodeImport\Specifications\UpgradeSpecification.cs" /> <Compile Include="MediaFiles\EpisodeImport\Specifications\UpgradeSpecification.cs" />
<Compile Include="MediaFiles\EpisodeImport\Specifications\NotSampleSpecification.cs" /> <Compile Include="MediaFiles\EpisodeImport\Specifications\NotSampleSpecification.cs" />
<Compile Include="MediaFiles\Events\EpisodeImportedEvent.cs" /> <Compile Include="MediaFiles\Events\EpisodeImportedEvent.cs" />

View File

@ -48,11 +48,6 @@ public void Route(ApplicationModes applicationModes)
{ {
_logger.Trace("Console selected"); _logger.Trace("Console selected");
_nzbDroneServiceFactory.Start(); _nzbDroneServiceFactory.Start();
if (_consoleService.IsConsoleApplication)
{
_consoleService.WaitForClose();
}
break; break;
} }
case ApplicationModes.InstallService: case ApplicationModes.InstallService:

View File

@ -15,16 +15,15 @@ public class StartNzbDroneServiceFixture : TestBase<StartNzbDrone>
[Test] [Test]
public void should_start_service_if_app_type_was_serivce() public void should_start_service_if_app_type_was_serivce()
{ {
string targetFolder = "c:\\NzbDrone\\"; const string targetFolder = "c:\\NzbDrone\\";
Subject.Start(AppType.Service, targetFolder); Subject.Start(AppType.Service, targetFolder);
Mocker.GetMock<IServiceProvider>().Verify(c => c.Start(ServiceProvider.NZBDRONE_SERVICE_NAME), Times.Once()); Mocker.GetMock<IServiceProvider>().Verify(c => c.Start(ServiceProvider.NZBDRONE_SERVICE_NAME), Times.Once());
} }
[Test] [Test]
public void should_start_console_if_app_type_was_serivce_but_start_failed_because_of_permissions() public void should_start_console_if_app_type_was_service_but_start_failed_because_of_permissions()
{ {
const string targetFolder = "c:\\NzbDrone\\"; const string targetFolder = "c:\\NzbDrone\\";
@ -32,7 +31,7 @@ public void should_start_console_if_app_type_was_serivce_but_start_failed_becaus
Subject.Start(AppType.Service, targetFolder); Subject.Start(AppType.Service, targetFolder);
Mocker.GetMock<IProcessProvider>().Verify(c => c.Start("c:\\NzbDrone\\NzbDrone.Console.exe", StartupArguments.NO_BROWSER, null, null), Times.Once()); Mocker.GetMock<IProcessProvider>().Verify(c => c.SpawnNewProcess("c:\\NzbDrone\\NzbDrone.Console.exe", StartupArguments.NO_BROWSER), Times.Once());
ExceptionVerification.ExpectedWarns(1); ExceptionVerification.ExpectedWarns(1);
} }

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Diagnostics;
using System.IO; using System.IO;
using NLog; using NLog;
using NzbDrone.Common; using NzbDrone.Common;
@ -73,7 +72,7 @@ private void Start(string installationFolder, string fileName)
_logger.Info("Starting {0}", fileName); _logger.Info("Starting {0}", fileName);
var path = Path.Combine(installationFolder, fileName); var path = Path.Combine(installationFolder, fileName);
_processProvider.Start(path, StartupArguments.NO_BROWSER); _processProvider.SpawnNewProcess(path, StartupArguments.NO_BROWSER);
} }
} }
} }