Služba v C# - NET otázka ohledně stability služby
Dobrý den,
potřebuji nutně konzultovat službu.
Služba se periodicky dotazuje databáze a je nezbytné, aby fungovala jednou a korektně.
Je napsaná v .NET C#
Účelem je spustit PHP skript, který spustí následně program B, který trvá různou dobu.
Jakmile se spuštěný program B dokončí, je žádoucí, aby služba zafungovala znovu a program B opět spustila.
A tento program B fungoval opět nějakou dobu.
Funguje to ovšem pouze nějakou dobu skvěle, ale pak program B přestane korektně pracovat.
Žádoucí je, aby nikdy nedošlo ke dvojitému spuštění programu B.
Bohužel se stává něco nežádoucího, kdy spuštěný program B kolabuje.
Poměrně jednoduchá služba:
public class ServiceImplementation : IWindowsService
{
private static Timer Timer;
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
/// <filterpriority>2</filterpriority>
public void Dispose()
{
Timer.Stop();
}
/// <summary>
/// This method is called when the service gets a request to start.
/// </summary>
/// <param name="args">Any command line arguments</param>
public void OnStart(string[] args)
{
Timer = new Timer(2000); // every 2 seconds
Timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
Timer.Start(); // <- important
}
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (Timer.Enabled == true)
Timer.Stop();
ProcessStartInfo start = new ProcessStartInfo();
// Enter in the command line arguments, everything you would enter after the executable name itself
start.Arguments = "-f c:\\Programy\\EasyPHP-Devserver-17\\eds-www\\program.php";
// Enter the executable to run, including the complete path
start.FileName = @"C:\Programy\EasyPHP-Devserver-17\eds-binaries\php\php5630vc11x86x200506203219\php.exe";
// Do you want to show a console window?
start.WindowStyle = ProcessWindowStyle.Hidden;
start.CreateNoWindow = true;
int exitCode;
// Run the external process & wait for it to finish
using (Process proc = Process.Start(start))
{
proc.WaitForExit();
// Retrieve the app's exit code
exitCode = proc.ExitCode;
}
if( Timer.Enabled == false)
Timer.Start();
}
/// <summary>
/// This method is called when the service gets a request to stop.
/// </summary>
public void OnStop()
{
Timer.Stop();
}
/// <summary>
/// This method is called when a service gets a request to pause,
/// but not stop completely.
/// </summary>
public void OnPause()
{
Timer.Stop();
}
/// <summary>
/// This method is called when a service gets a request to resume
/// after a pause is issued.
/// </summary>
public void OnContinue()
{
Timer.Start();
}
/// <summary>
/// This method is called when the machine the service is running on
/// is being shutdown.
/// </summary>
public void OnShutdown()
{
Timer.Stop();
}
Vidí tady někdo nějaký problém, který zapřičiní, že se program B (ve skriptu program.php) může spustit vícekrát ?
Případně nějaký Fix ?
Děkuji mnohokrát, klidně doplním případné info.
A kolabuje protože se spouští dvakrát?
Program nazvaný program B, který spouští PHP skript se nesmí spustit 2x ve stejném čase.
Přesný důvod kolabsu mi bohužel není znám.
Tak se ptám, jestli je ve službě nebezpečí, že to spustí 2x ve stejný čas (kdy první instance programu B "ještě" běží).
Teda takto program B se přes putty někam připojí a něco dělá.
A nesmí se připojovat na zařízení 2x, protože nepodporuje dvojité přihlášení.
Na prvni pohled nevidím důvod, proč by se to mělo spustit dvakrát.
Dobře. A mohu se zeptat doplňující otázku, přes jaký software by ses připojoval přes telnet skrze PHP?
Já používám k připojení starší knihovnu https://www.geckotribe.com/php-telnet/
No já bych to hlavně nedělal pomocí PHP.
Podle me ti to php.exe vrati exit code, i kdyz script (program.php) jeste bezi (udelal mu pro beh instanci v jinym vlakne) . Proc to neresis cely v jednom - bud v php nebo v c# ?
Zabuduj si do programu B jednoduchy semafor. Na zatatku spusteni programu se zapise do nejake tabulky/souboru ze program bezi, na konci program zapise, ze skoncil.
Sluzba se koukne a pokud B neskoncil, bude cekat, po nejake dobe pak bude informovat, ze B se zase seknul