Restart usługi windows

0

Witam
mam napisana usługę. dodałem do niej opcję upgrade. Jak zrobić restart tej usługi - najlepiej żeby to ten serwis restartował sam siebie.
Macie jakieś pomysły ??

0

Chyba sie nie da żeby restartowal sam siebie.

1

Wywołać skrypt w powershellu?

1

Program nie może sam siebie zrestartować, bo jeśli zakończy działanie, to już żadnego kodu nie wykona. Tak samo nie może sam siebie usunąć czy zmodyfikować zawartości pliku wykonywalnego, z którego dany proces został uruchomiony.

Żeby to obejść, stosuje się różnego rodzaju skrypty (choćby stare dobre pliki .bat) lub zewnętrzne programy, które czekają aż dany proces zakończy działanie, następnie uruchamiają go i same się zamykają – całość jest niewidzialna dla użytkownika.

2

A nie lepiej zrobić to po ludzku? Oddzielna usługa (włączana na żądanie) aktualizująca program/usługę główną? Usługa główna sprawdza czy jest aktualizacja, jeśli jest uruchamia usługę aktualizacji, wyłącza się sama. Po skończonej aktualizacji proces aktualizujący odpala usługę główną i się sam wyłącza.

0

To jest trochę obejście, ale można wymusić restart poprzez wywołanie błędu (nie wiem, jak to się robi), a w konfiguracji usługi ustawić, że w przypadku wystąpienia pierwszego, drugiego i kolejnego błędu uruchomić ponownie usługę.

0
furious programming napisał(a):

Program nie może sam siebie zrestartować, bo jeśli zakończy działanie, to już żadnego kodu nie wykona. Tak samo nie może sam siebie usunąć czy zmodyfikować zawartości pliku wykonywalnego, z którego dany proces został uruchomiony.

Żeby to obejść, stosuje się różnego rodzaju skrypty (choćby stare dobre pliki .bat) lub zewnętrzne programy, które czekają aż dany proces zakończy działanie, następnie uruchamiają go i same się zamykają – całość jest niewidzialna dla użytkownika.

uses shellapi ///// przykład na restart programu

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellExecute(Handle,'Open',PChar(paramstr(0)), nil,nil,sw_show);
  Application.Terminate;
end;

aplikacja może usunąć się sama siebie. Tak działają właśnie wirusy.
Plik wykonywalny może się zmodyfikować poprzez tworzenie pliku ~.temp a poprzez pliki wsadowe .bat.dopisanie do nich wartości. Po czym plik oryginalny jest usuwany a działa plik z wirusem.

Tomek Pycia a jak myślisz jak są obliczane wielkie liczby pierwsze?

2
Bruno(M) napisał(a):

uses shellapi ///// przykład na restart programu

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellExecute(Handle,'Open',PChar(paramstr(0)), nil,nil,sw_show);
  Application.Terminate;
end;

To jest bardzo słaby sposób.

Jeśli aplikacja wykorzystuje relatywnie dużo pamięci i podczas zamykania zwalnia kupę danych, to proces nie zdąży tej pamięci zwolnić, pozapisywać danych i się zamknąć przed uruchomieniem drugiej instancji. Jeśli do tego mamy blokadę tylko na jedną instancję, to ten restart w najlepszym wypadku nie zadziała w ogóle, a w najgorszym, obie instancje będą walczyć o dane z plików (stara instancja zapisuje, nowa odczytuje) i powstanie bajzel. Wystarczy że zamykanie procesu potrwa sekundę i już dupa zbita.

Lepiej po prostu skorzystać z konkretnych mechanizmów systemowych (o których sam zostałem poinformowany – za co dziękuję) lub wykorzystać zewnętrzne mini-programy/pliki wsadowe, które najpierw poczekają na zakończenie bieżącej sesji, a dopiero po tym odpalą nową (i się zamkną).

1 użytkowników online, w tym zalogowanych: 0, gości: 1