Napisz program, który uruchomi się ponownie po zakończeniu.
Jednocześnie nie powinno być uruchomionych więcej niż jedno wystąpienie programu. Nawet przez najdrobniejszy moment.
Możesz zignorować każde wystąpienie ręcznie uruchomione przez użytkownika podczas cyklu. Ale twój kod nie powinien tego robić w cyklu restartu.
Program można uruchomić po dowolnym czasie, o ile jest gwarantowane, że uruchomi się ponownie.
Jedynym sposobem na zatrzymanie cyklu jest zabicie procesu.
Twoje rozwiązanie nie powinno obejmować ponownego uruchamiania środowiska (w którym uruchomiony jest program, obejmuje system operacyjny, maszynę, maszynę wirtualną, powłokę itp.). Tylko twój program może się zrestartować.
popularity-contest
drobnoustrój
źródło
źródło
exec
działa w systemie Linux?shutdown -r -t 0 -f
”.Odpowiedzi:
Skrypt Bash, 3 znaki (najkrótszy, być może najbardziej elegancki, choć z pewnością kontrowersyjny)
Po prostu umieszcza nowe wystąpienie siebie w tle (nowy proces), a następnie kończy działanie. Nowa instancja prawdopodobnie pozostanie w kolejce uruchamiania programu planującego do czasu wykonania poprzedniej instancji.
Ostrzeżenie - jest to trudne
kill
, ponieważ PID ciągle się zmienia. Tymczasowa zmiana nazwy pliku skryptu jest prawdopodobnie najprostszym sposobem na przerwanie cyklu.Zakłada się system jednordzeniowy. Oczywiście nie jest to realistyczne w przypadku Linuksa na nowoczesnym sprzęcie typu bare-metal, ale można go łatwo skonfigurować podczas pracy na maszynie wirtualnej. Prawdopodobnie moglibyśmy osiągnąć podobną sztuczkę
taskset
, ale zmniejszyłoby to wpływ rozwiązania 3-char.Ta odpowiedź nieco wygina reguły, ponieważ stosuje określone znaczenie „biegania”. Będą chwile, kiedy nowy proces zostanie
fork()
zmodyfikowany, a stary proces będzie nadal żywy - tzn. Możliwe będzie zaobserwowanie więcej niż jednego PID. Jednak nowy proces zostanie umieszczony w kolejce uruchomieniowej programu planującego Linux w celu oczekiwania na cykle procesora, podczas gdy istniejący proces będzie kontynuowany. W tym momencie wszystko, co musi być zrobione przez istniejący proces, jest dlabash
siebieexit()
. Zajmuje to skończoną ilość czasu, choć jestem całkiem pewien, że zostanie to zrobione na długo przed wykonaniem bieżącej kwanty czasu / harmonogramu. Potwierdzającym dowodem jest fakt, żebash
uruchamia się i wyłącza w 2ms na mojej maszynie wirtualnej:Dalsze dowody potwierdzające, że nowy proces faktycznie nie działa, dopóki poprzedni proces nie zostanie wykonany, można znaleźć w
strace
danych wyjściowych:Na wyjściu widzimy, że pierwotny proces ma PID 6929. Widzimy
fork()
wywołanie (faktycznieclone()
), które zwraca nowy PID 6930. W tym momencie są 2 PID, ale obecnie tylko 6929 działa:Pełna
strace
moc tutaj.Widzimy, że 6930 nie generuje żadnych wywołań systemowych, dopóki 6929 nie zostanie całkowicie wykonane. Można założyć, że oznacza to, że 6930 w ogóle nie działa, dopóki nie zostanie wykonane 6929.
perf
Narzędzie byłby najlepszy sposób to udowodnić.źródło
top
nie jest odpowiednim narzędziem do użycia tutaj. Widzę jednak, żetime bash -c :
zajmuje to tylko 2ms na mojej maszynie Wirtualnej Ubuntu, więc nie sądzę, że nierozsądne jest oczekiwaniebash
zakończenia procesu zamykania przed ukończeniem kwantowania.Rozwiązanie 1
PHP, 32 znaki
Wysyła nagłówek, a następnie zatrzymuje się. Po 3 sekundach strona zostanie ponownie załadowana.
plik a.php
Można to zatrzymać, przerywając wykonywanie strony przed wysłaniem nagłówków lub po prostu zabijając przeglądarkę.
Rozwiązanie 2
PHP, 2 strony
Rozważmy dwa pliki dwa różne programy. Dwa pliki znajdują się w tym samym folderze.
plik a.php
plik b.php
Zakończenie jednej ze stron przed wysłaniem nagłówków powoduje zakończenie programu (zabija również przeglądarkę).
Oto ten sam program w
ASP.NET
plik a.aspx
plik b.aspx
źródło
sh
Działa to na każdym systemie zgodnym z Posix.
Aby go zabić, usuń plik lub użyj
atrm
.źródło
grzmotnąć
exec
zastępuje powłokę bez tworzenia nowego procesu. Dzięki temu nie będzie drugiej instancji.źródło
~/.bash_profile
!$0
jest-bash
kiedy.bash_profile
jest pozyskiwany, więc spowodowałoby to tylko błąd składniowy.exec ${0##-}
w~/.bash_profile
pracach :-)Harmonogram zadań systemu Windows (macierzysty)
C ++. Koszmar programowania COM. Spełnia wszystkie wymagania dotyczące wyzwań.
Kompiluj z MSVC (lub MinGW GCC, jeśli masz wszystkie zależności).
Program uruchomi i zarejestruje jednorazowe zadanie w harmonogramie zadań systemu Windows, aby uruchomić się 5 sekund później (Panel sterowania -> Narzędzia administracyjne -> Harmonogram zadań do wyświetlenia, zadanie nosi nazwę „Uruchom ponownie”). Program zatrzyma się na 5 sekund, aby dać ci szansę zabicia go, zanim utworzy zadanie.
Wymagania dotyczące wyzwań:
Uruchamia się ponownie po zakończeniu. Tak. Zadanie jest zaplanowane tuż przed wyjściem z programu.
Nie więcej niż jedna instancja programu działającego w tym samym czasie. Tak. Program kończy się całkowicie i nie działa przez 5 sekund. Jest uruchamiany przez program planujący.
Możesz zignorować każde wystąpienie ręcznie uruchomione przez użytkownika podczas cyklu. Tak, jako efekt uboczny używania stałej nazwy zadania.
Tak długo, jak jest gwarantowane, że zacznie się od nowa. Tak, pod warunkiem, że Harmonogram zadań jest uruchomiony (jest w standardowej konfiguracji systemu Windows).
Jedynym sposobem na zatrzymanie cyklu jest zabicie procesu. Tak, proces może zostać zabity podczas trwającego 5 sekund okna. Program usuwa zadanie przed 5-sekundowym opóźnieniem, zabicie go w tym momencie nie pozostawi zbłąkanego zadania w harmonogramie.
Twoje rozwiązanie nie powinno obejmować ponownego uruchamiania środowiska Tak.
Nawiasem mówiąc, jeśli ktoś kiedykolwiek zastanawiał się, dlaczego aplikacje Windows były tak niestabilne (przed pojawieniem się .NET i C #), jest to jeden z powodów. Wymagana obsługa błędów (gdybym to załączyła), zarządzanie zasobami i gadatliwość ustawiają sytuacje podatne na błędy, jeśli programista jest nawet trochę leniwy (powyższy kod jest bardzo leniwy).
O wiele łatwiejszą i krótszą alternatywą jest wywołanie schtasks.exe. Przesłałem również tę wersję w skrypcie .BAT .
źródło
BBC BASIC - hołd dla Snow Patrol
Emulator na bbcbasic.co.uk
Ten jest trochę inny. Drukuje wiersz utworu „Run” i odtwarza arpeggio akordów, abyś mógł śpiewać. Został zainspirowany faktem, że polecenie wykonania (a zatem i ostatniego wiersza programu) to oczywiście RUN.
Wszystkie zmienne są usuwane na początku programu, więc zabiera kolor ekranu pozostawiony przez poprzednią iterację, aby zdecydować, który wiersz należy wydrukować w następnej kolejności.
WYDAJNOŚĆ (montaż 4 różnych zrzutów ekranu)
źródło
HTML / JavaScript:
Kod powoduje zniszczenie strony, na której działa, a następnie odtworzenie innej instancji samego siebie, gdy przeglądarka ponownie ładuje stronę.
AFAIK, jedynym wyjściem jest zabicie zakładki, na której działa strona.
EDYCJA: zgodnie z popularnym żądaniem prawidłowy kod HTML5:
źródło
do
Ten program działa jak dużo złośliwego oprogramowania. Tuż przed zamknięciem tworzy skrypt powłoki w katalogu / tmp. Widoczne jest uruchomienie skryptu powłoki, który pozwala oryginalnemu programowi zamknąć i anulować oryginalny PID. Po krótkim czasie (2 sekundy) skrypt powłoki rozpoczyna nowy proces z programem. Dla zwięzłości lokalizacja programu jest ustalona jako „/ tmp / neverend /”.
W danym momencie działa tylko jeden „niekończący się” proces. Każdy nowy proces otrzymuje nowy PID. Najłatwiejszym sposobem na zabicie tego jest usunięcie pliku wykonywalnego. Jeśli chcesz uczynić go bardziej złośliwym, możesz skopiować zarówno plik wykonywalny, jak i skrypt, aby upewnić się, że w programie jest wiele kopii na dysku w dowolnym momencie.
źródło
system()
jeśli reguły nie liczą fork + exec/bin/sh
jako programu dodatkowego.Perl
Skrypt wydaje polecenie systemowe, aby się zabić, i przesłać wynik do innej instancji samego siebie. Interpreter Perla jest używany do zabijania, z powodów wieloplatformowych.
Zatrzymaj szaleństwo, usuwając skrypt.
źródło
Atari 8-bit Basic
Tokenizuje do:
Wewnętrznie usuwa wewnętrzne struktury, zasadniczo usuwając program, zanim ponownie uruchomi go z listingu.
To zasadniczo różni się od:
Który symbolizuje:
Jest to podstawowa nieskończona pętla. Kiedy je uruchomisz, zobaczysz różnicę prędkości (pierwsza jest wolniejsza).
źródło
LIST
nie zobaczysz, że działa. Wybrałem,LIST
ponieważ ma najkrótsze wejścieL.
. Podoba mi się pomysł umieszczenia tego w buforze klawiatury, z pewnością jest wystarczająco krótki!Return
? Jak duży jest bufor klawiatury? W VIC-20 i C64 ma dziesięć bajtów. Program, który robi wystarczająco dużo nacisków, aby załadować bufor klawiatury, prawdopodobnie nie zmieściłby się w buforze klawiatury, ale napisałem programy, które same się modyfikowałyby, drukując zmiany na ekranie, a następnieRUN
wprowadziły kilkaReturn
naciśnięć klawiszy. Takie rzeczy były szczególnie przydatne na 64, ponieważ nie miał polecenia [IIRC], któreIN
Atari ma do łączenia linii w program.Na komputerze mainframe IBM z systemem operacyjnym z / OS uruchamiane jest narzędzie, które kopiuje zestaw danych (plik) do innego zestawu danych (plik). Dane wejściowe są źródłem przesłanego języka JCL (Job Control Language), który spowodował jego uruchomienie. Wyjściem jest czytnik wewnętrzny (INTRDR). Musisz także upewnić się, że Twój system nie pozwala na uruchamianie wielu identycznych nazw zadań. Dobrze jest użyć klasy zadania, która ma tylko jednego inicjatora (miejsce, w którym zadanie może działać wsadowo).
Brak zaangażowanych identyfikatorów PID (w systemie z / OS), więc nie powiedzie się zestaw wyzwań.
Zatrzymujesz proces, opróżniając i / lub spłukując. Jeśli coś poszło nie tak, poprzez drenaż i / lub spłukiwanie, przeklinanie, kopanie, próbę ciepłego startu i wreszcie przez zimny start lub uderzenie w Big Red Button (i strzelanie do programisty).
Mogłem przesadzać po drodze, ale nie próbuj tego w pracy ...
Przykład użycia SORT. Szczegóły dotyczące karty JOB są bardzo zależne od strony. Zasady witryny mogą zabraniać lub uniemożliwiać korzystanie z INTRDR. Do korzystania z INTRDR może być wymagana konkretna klasa. Jeśli zasady witryny zabraniają korzystania z niego , nie używaj go, chyba że chcesz zabrać swoje rzeczy na spacer w tekturowym pudełku.
Chociaż INTRDR ma dobre zastosowania, nie należy go używać do tego celu . Nie będziesz nawet mieć szansy na zdobycie swojego pudełka.
Inne narzędzia są dostępne. Szybki program byłby również łatwy do zrobienia, wystarczy przeczytać plik, napisać plik.
Jeśli chcesz, aby przykład tego nie powiódł się, spróbuj: http://ibmmainframes.com/viewtopic.php?p=282414#282414
Tradycyjnym sposobem kopiowania zestawu danych jest użycie narzędzia IBM IEBGENER, jak ugoren wspomina w swoim komentarzu.
Jednak w dzisiejszych czasach wiele witryn będzie miało „alias” IEBGENER do ICEGENER. Jeśli to możliwe, ICEGENER użyje DFSORT IBM (lub jego konkurencyjnego SyncSort) do wykonania kopii, ponieważ produkty SORT są znacznie bardziej zoptymalizowane pod kątem IO niż IEBGENER.
Właśnie wycinam środkowego człowieka za pomocą SORT.
Jeśli pracujesz w serwisie IBM Mainframe, znasz format karty JOB, której powinieneś używać. Minimalna karta JOB jest, jak pokazałem, bez komentarza. Komentarz będzie ważny, ponieważ na przykład możesz podać informacje księgowe. Nazwa zadania prawdopodobnie będzie miała format specyficzny dla witryny.
Niektóre witryny blokują lub uniemożliwiają korzystanie z INTRDR. Być świadomym.
Niektóre witryny umożliwiają jednoczesne uruchamianie wielu zadań o tej samej nazwie. Być świadomym.
Chociaż chyba, że nie jesteś programistą systemu, nie możesz skonfigurować takiej klasy, powinieneś poszukać klasy, która zezwala tylko na jednego inicjatora. Dzięki temu proces jest dość bezpieczny - ale bądź absolutnie pewien, że klasa działa zgodnie z opisem. Test. Nie z tą pracą.
Jeśli jesteś programistą systemu, wiesz, że nie możesz nic robić poza twoim zakresem kompetencji. powiedział nuff.
Przy jednym zadaniu o tej samej nazwie dozwolonym w tym samym czasie i pojedynczym inicjatorze będzie to ciągły strumień rozpoczęcia / zakończenia zadania następny początek / koniec zadania - dopóki nie wypełni się szpuli (kolejna zła rzecz do zrobienia) danymi wyjściowymi z tysiące zadań (lub zabrakło numerów zadań). Obserwuj konsolę JES pod kątem komunikatów ostrzegawczych.
Zasadniczo nie rób tego. Jeśli to zrobisz, nie rób tego na maszynie produkcyjnej.
Przy odrobinie odświeżenia rozważę kolejną odpowiedź na pytanie, jak to zrobić w innym systemie operacyjnym IBM Mainframe, z / VSE ... z / VSE używa JCL. z / OS używa JCL. Oni są różni :-)
źródło
IEBGENER
tamtych czasach zwykliśmy kopiować.Python (72 bajty)
Może być mniejszy. Po pierwsze, wpisując na stałe nazwę pliku (zamiast używać
__file__
). Ale tutaj możesz umieścić ten kod w pliku i uruchomić go, niezależnie od jego nazwy :)źródło
&&
na&
.Harmonogram zadań systemu Windows (.BAT)
Skrypt wsadowy Windows. Spełnia wszystkie wymagania dotyczące wyzwań.
O ile widzę, jest to jedyne jak dotąd rozwiązanie Windows, które spełnia wszystkie wymagania i nie ma niestandardowych zależności (moje inne rozwiązanie jest podobne, ale wymaga kompilacji).
Program zachowuje się podobnie do mojej odpowiedzi C ++ / COM .
Program uruchomi i zarejestruje jednorazowe zadanie w harmonogramie zadań systemu Windows, aby uruchomić się do 60 sekund później (Panel sterowania -> Narzędzia administracyjne -> Harmonogram zadań do wyświetlenia, zadanie nosi nazwę „Uruchom ponownie”). Program zatrzyma się na 5 sekund, aby dać ci szansę zabicia go, zanim utworzy zadanie.
Wykorzystuje interfejs harmonogramu zadań wiersza poleceń
schtasks.exe
. Arytmetyka w skrypcie polega na obliczaniu przesunięć czasowych przy zachowaniu aktualności czasu w formacie GG: MM.Wymagania dotyczące wyzwań:
Uruchamia się ponownie po zakończeniu. Tak. Zadanie jest zaplanowane tuż przed wyjściem z programu.
Nie więcej niż jedna instancja programu działającego w tym samym czasie. Tak. Program kończy się całkowicie i nie działa przez ~ 60 sekund. Jest uruchamiany przez program planujący.
Możesz zignorować każde wystąpienie ręcznie uruchomione przez użytkownika podczas cyklu. Tak, jako efekt uboczny używania stałej nazwy zadania.
Tak długo, jak jest gwarantowane, że zacznie się od nowa. Tak, pod warunkiem, że Harmonogram zadań jest uruchomiony, a program schtasks.exe jest obecny (oba są prawdziwe w domyślnych konfiguracjach systemu Windows).
Jedynym sposobem na zatrzymanie cyklu jest zabicie procesu. Tak, proces może zostać zabity podczas trwającego 5 sekund okna. Program usuwa zadanie przed 5-sekundowym opóźnieniem, zabicie go w tym momencie nie pozostawi zbłąkanego zadania w harmonogramie.
Twoje rozwiązanie nie powinno obejmować ponownego uruchamiania środowiska Tak.
Uwaga: Z powodu ograniczonego interfejsu wiersza poleceń czas ponownego uruchomienia musi być określony w minutach, a zadanie nie uruchomi się ponownie na laptopach bez podłączonego zasilacza sieciowego (przepraszam).
źródło
Powłoka Unix
Nie widziałem jeszcze wielu rozwiązań, które polegają na niezwiązanym programie do jego ponownego uruchomienia. Ale właśnie do tego
at(1)
służy narzędzie:Naprawdę trudno jest złapać uruchomiony program, ponieważ działa on tylko raz na minutę i kończy się tak szybko. Na szczęście
atq(1)
narzędzie pokaże, że nadal działa:I
atrm(1)
pozwoli ci przerwać cykl:Można wymienić
1 minute
z1 hour
lub1 week
. Możesz też dać1461 days
program, który będzie uruchamiany raz na 4 lata.źródło
PowerShell
Nadużywam (i prawdopodobnie łamię) własną zasadę.
Ponowne uruchomienie się zajmuje nieskończoną ilość czasu.
Można go zabić, zabijając proces hosta.
Po prostu poczekaj i zobacz;)
źródło
while true; do sleep 1; done
pikuje, prawda?Grzmotnąć
Zapisz to jako repeat.sh w katalogu / i daj mu uprawnienia do wykonania. Można go zabić, usuwając plik
Działa to poprzez umieszczenie wpisu w crontab, aby uruchomić go 1 minutę później.
źródło
Visual Base 6 :)
Aby uruchomić, utwórz nowy projekt, dodaj moduł z tym kodem, ustaw obiekt startowy na „Sub Main”, skompiluj, a następnie uruchom plik wykonywalny.
Bardziej czytelna wersja:
źródło
HTML / JAVASCRIPT
PLIK HTML a.html
źródło
Grzmotnąć
Dłużej niż to musi być, ale jestem zmęczony i nie obchodzi mnie to :)
Powiedziałeś, że musi się zrestartować po zakończeniu, nie powiedziałeś konkretnie, że musi to robić wielokrotnie lub w nieskończoność. Powiedziałeś też, że nigdy nie powinny działać dwie instancje naraz ... nigdy nie będzie. ;)
Jest na to wiele sposobów. Moim osobistym faworytem byłoby zrobienie czegoś takiego jak wysłanie pakietu gdzieś daleko, a następnie (za pomocą dowolnej liczby metod), aby reakcja wyzwoliła proces.
źródło
sleep
proces ten uruchamia się ponownie po zakończeniuAndroid: Alarm uruchomi ponownie Aktywność po 1 sekundzie
źródło
Środowisko C + MPI
mpifork.c:
Musisz mieć zainstalowany OpenMPI lub inną implementację MPI.
Połącz zTeraz, gdy o tym myślę, nie ma powodu, aby używać mpicc - gcc lub innego kompilatora, który zadziała. Musisz tylko mieć mpirun.Aby go uruchomić, prawdopodobnie powinieneś podać pełną nazwę ścieżki i listę hostów. Na przykład dodałem niektóre wpisy w / etc / hosts, które wskazywały na localhost i uruchomiłem to w następujący sposób:
Plik wykonywalny musi znajdować się w tym samym katalogu na dowolnym komputerze, na którym chcesz go uruchomić.
Zasadniczo bierze to listę hostów podaną w wierszu poleceń, wybiera jeden z hostów i uruchamia plik wykonywalny na hoście docelowym z tymi samymi argumentami. Jeśli wszystko pójdzie idealnie, mpirun będzie wywoływał się w kółko na różnych komputerach (lub na tym samym komputerze, jeśli podasz tylko „localhost”. Sam plik wykonywalny (mpifork) kończy działanie - po wywołaniu przestaje działać
execvp
na pierwszej maszynie).Jeśli chcesz być zły, możesz zamiast tego uruchomić to na każdym komputerze, dołączając pełną listę hostów, która znajduje się w wierszu poleceń
args
. To odrodziłoby kopię samego siebie na każdej maszynie, w kółko - widełkową klaster.Jednak w tej formie jestem pewien, że spełnia to zasady.
źródło
JavaScript
Bez „wchodzenia do sieci”, gdy nie jest to konieczne :-) Planowanie pętli zdarzeń JavaScript pozwala nam bardzo łatwo pisać programy, które spełniają podane wymagania:
Spowoduje to „ponowne uruchomienie”
program
funkcji w tempie 10 razy na sekundę. Ze względu na naturę JavaScript jest zagwarantowane, że w tym samym czasie uruchomione zostanie tylko jedno zadanie, i nie „restartuje środowiska” jak w „przeładowaniu strony”.źródło
Montaż x86
Nie jestem do końca pewien, czy spełnia to twoje kryteria, ponieważ nie odradza się nowy proces, ale i tak jest.
Program wyświetli okno komunikatu, przydzieli część pamięci, skopiuje własną sekcję kodu do przydzielonej pamięci, a następnie przeskoczy do tej lokalizacji, rozpoczynając cykl od początku. Powinien działać, dopóki malloc się nie powiedzie.
Kompilowany z FASM.
źródło
@
kiedy to zrobisz, ponieważ prawdopodobnie nie będę mieć na to oko).Linux upstart init
Biorąc pod uwagę najściślejsze czytanie pytania, myślę, że jest to niemożliwe. W gruncie rzeczy wymaga spontanicznego uruchomienia programu bez pomocy innych uruchomionych programów.
Istnieją pewne
at
ichron
oparte na odpowiedziach odpowiedzi, ale przy najsurowszym czytaniu,atd
ianacron
są to dodatkowe programy, które działają cały czas, więc mogą zostać zdyskwalifikowane.Podobnym podejściem, ale nieco niższym poziomem jest używanie Linuksa
init
. Jako root dodaj ten plik .conf do/etc/init/
:Więc mam
init
ponownie przeczytaj jego pliki .conf:Rozpocznie się
sleep
proces, który będzie trwał 10 sekund, a następnie zakończy się.init
odrodzi sięsleep
po wykryciu, że poprzedni zniknął.Oczywiście jest to nadal używany
init
jako program dodatkowy. Można argumentować, żeinit
jest to logiczne rozszerzenie jądra i woli zawsze będzie dostępne w dowolnym systemie Linux.Jeśli nie jest to do zaakceptowania, myślę, że następną rzeczą do zrobienia na niższym poziomie byłoby stworzenie modułu jądra, który odradza proces przestrzeni użytkownika (nie jestem pewien, jak to jest łatwe). Tutaj można argumentować, że jądro nie jest procesem, a zatem nie programem (dodatkowym). Z drugiej strony jądro jest samodzielnym programem z punktu widzenia procesora.
źródło
TI-BASIC: 5 znaków
nazwać
prgmA
źródło
:
dopiero początek symbolu linii, gdy programujesz w TI-basic. To nie jest coś, co piszesz, jest tylko w edytorze.A
wartość i wykorzystaj jej wartość jako przypadek podstawowy, w końcu zobaczysz, że stopniowo się zmienia.