Ecrivez un programme qui se recommence à la fin.
Il ne devrait pas y avoir plus d'une instance du programme en cours d'exécution en même temps. Pas même pour le moindre moment.
Vous pouvez ignorer toute instance démarrée manuellement par l'utilisateur au cours de votre cycle. Mais votre code ne devrait pas le faire dans votre cycle de redémarrage.
Le programme peut démarrer après n’importe quelle durée, à condition qu’il soit garanti qu’il redémarre.
Le seul moyen d'arrêter le cycle est de tuer le processus.
Votre solution ne devrait pas impliquer le redémarrage de l'environnement (dans lequel le programme est en cours d'exécution, inclut le système d'exploitation, la machine, la machine virtuelle, le shell, etc.). Seul votre programme est autorisé à redémarrer.
la source
exec
fait Linux?shutdown -r -t 0 -f
".Réponses:
Script Bash, 3 caractères (Le plus court, peut-être le plus élégant, bien que controversé)
Il place simplement une nouvelle instance de lui-même en arrière-plan (nouveau processus), puis se ferme. La nouvelle instance restera probablement dans la file d'attente du planificateur jusqu'à ce que l'instance précédente soit terminée.
Avertissement - cela est difficile
kill
, car le PID change continuellement. Renommer temporairement le fichier de script est probablement le moyen le plus simple de rompre le cycle.Un système monocœur est supposé. Bien sûr, cela n’est pas réaliste avec Linux sur du matériel nu-metal moderne, mais il est facilement configurable lorsqu’il est exécuté sur une VM. Nous pourrions probablement réaliser une astuce similaire en utilisant
taskset
, mais cela réduirait l'impact de la solution à 3 caractères.Cette réponse déroge un peu aux règles dans le sens où elle applique un sens spécifique de "courir". Il y aura des moments où le nouveau processus aura été
fork()
modifié et où l'ancien processus sera toujours actif - c'est-à-dire qu'il sera peut-être possible d'observer plus d'un PID. Toutefois, le nouveau processus sera placé dans la file d'attente d'exécution du planificateur Linux pour attendre les cycles du processeur, tandis que le processus existant continuera à s'exécuter. À ce stade, tout ce qui doit être fait par le processus existantbash
s’impose à lui-mêmeexit()
. Cela prend un temps fini, même si je suis assez confiant que cela sera fait bien avant que le quantum actuel de timelice / scheduler soit terminé. Les preuves à l'appui sont le fait quebash
démarre et s'arrête en 2ms sur ma VM:Les autres éléments de preuve à l'appui du fait que le nouveau processus ne s'exécute pas tant que le processus précédent n'est pas terminé sont visibles dans l'
strace
output:Dans la sortie, nous voyons que le processus d'origine a le PID 6929. Nous pouvons voir l'
fork()
appel (en faitclone()
), qui renvoie un nouveau PID de 6930. À ce stade, il existe 2 PID, mais seul le 6929 est en cours d'exécution:strace
Sortie complète ici.Nous pouvons voir que le 6930 n’émet aucun appel système jusqu’à ce que le 6929 soit complètement terminé. Il est raisonnable de supposer que cela signifie que 6930 ne fonctionne pas du tout jusqu'à ce que 6929 soit terminé. L'
perf
utilitaire serait le moyen ultime de le prouver.la source
top
n'est pas le bon outil à utiliser ici. Cependant, je vois que celatime bash -c :
ne prend que 2 ms sur ma machine virtuelle Ubuntu, donc je ne pense pas qu’il soit déraisonnable de s’attendrebash
à terminer son arrêt avant que son quantum de planification ne soit terminé.Solution 1
PHP, 32 caractères
Il envoie l'en-tête puis il s'arrête. Après 3 secondes, la page est rechargée.
fichier a.php
Cela peut être arrêté en mettant fin à l'exécution de la page avant l'envoi des en-têtes ou simplement en tuant le navigateur.
Solution 2
PHP, 2 pages
Considérons les deux fichiers deux programmes différents. Les deux fichiers sont dans le même dossier.
fichier a.php
fichier b.php
Terminer une des pages avant que les en-têtes ne soient envoyés met fin au programme (tuer le navigateur fonctionne également).
Voici le même programme dans
ASP.NET
fichier a.aspx
fichier b.aspx
la source
sh
Cela fonctionnera sur n’importe quel système conforme à Posix.
Pour le tuer, supprimez le fichier ou utilisez
atrm
.la source
frapper
exec
remplace le shell sans créer de nouveau processus. Cela garantit qu'il ne peut y avoir une deuxième instance.la source
~/.bash_profile
!$0
est-bash
quand.bash_profile
est source, ce qui entraînerait une erreur de syntaxe.exec ${0##-}
dans les~/.bash_profile
travaux :-)Planificateur de tâches Windows (natif)
C ++. Un cauchemar de la programmation COM. Répond à toutes les exigences du défi.
Compilez avec MSVC (ou MinGW GCC si vous avez toutes les dépendances).
Le programme va démarrer et enregistrer une tâche unique avec le planificateur de tâches Windows pour démarrer lui-même 5 secondes plus tard (Panneau de configuration -> Outils d'administration -> Planificateur de tâches à afficher, la tâche est nommée "Restarter"). Le programme s'interrompt pendant 5 secondes pour vous donner une chance de le tuer avant qu'il ne crée la tâche.
Exigences du défi:
Se remet en marche quand fini. Oui. La tâche est planifiée juste avant la sortie du programme.
Pas plus d'une instance du programme en cours d'exécution en même temps. Oui. Le programme se termine complètement et ne s'exécute pas pendant 5 secondes. Il est lancé par le planificateur.
Vous pouvez ignorer toute instance démarrée manuellement par l'utilisateur au cours de votre cycle. Oui, comme effet secondaire de l’utilisation d’un nom de tâche constant.
Tant qu'il est garanti que cela recommence. Oui, à condition que le planificateur de tâches soit en cours d'exécution (il s'agit d'une configuration Windows standard).
Le seul moyen d'arrêter le cycle est de tuer le processus. Oui, le processus peut être tué pendant la fenêtre de 5 secondes pendant son exécution. Le programme supprime la tâche avant le délai de 5 secondes. La tuer à ce moment-là ne laissera pas une tâche parasite dans le planificateur.
Votre solution ne devrait pas impliquer le redémarrage de l'environnement . Oui.
À propos, si quelqu'un se demandait pourquoi les applications Windows étaient si instables (avant l'avènement de .NET et C #), c'est l'une des raisons. La quantité de gestion d'erreur requise (si je l'avais incluse), la gestion des ressources et la verbosité créent des situations très sujettes aux erreurs si un programmeur est même le plus peu paresseux (le code ci-dessus est extrêmement paresseux).
Une alternative beaucoup plus facile et plus courte consiste à appeler schtasks.exe. J'ai également soumis une version avec cela dans un script .BAT .
la source
BBC BASIC - un hommage à Snow Patrol
Emulator sur bbcbasic.co.uk
Celui-ci est un peu différent. Il imprime un couplet de la chanson "Run" et joue un arpège d'accords pour que vous puissiez chanter. Cela a été inspiré par le fait que la commande à exécuter (et donc la dernière ligne du programme) est bien sûr RUN.
Toutes les variables sont effacées au début du programme, il faut donc que la couleur de l'écran laissée par l'itération précédente soit choisie pour décider quel verset imprimer ensuite.
SORTIE (montage de 4 captures d'écran différentes)
la source
HTML / JavaScript:
Le code déclenche la destruction de la page sur laquelle il s'exécute, puis la recréation d'une autre instance lorsque le navigateur charge à nouveau la page.
Autant que je sache, le seul moyen de sortir est de tuer l'onglet dans lequel la page est en cours d'exécution.
EDIT: selon la demande courante, un code HTML5 valide:
la source
C
Ce programme agit comme beaucoup de malware. Juste avant de se fermer, il crée un script shell dans le répertoire / tmp. Il demande de démarrer le script shell, ce qui permet au programme original de se fermer et d’annuler le PID original. Après une brève période (2 secondes), le script shell démarre un nouveau processus avec le programme. Par souci de brièveté, l'emplacement du programme est câblé en tant que '/ tmp / neverend /'.
Il n'y a jamais qu'un processus "Neverend" en cours d'exécution à la fois. Chaque nouveau processus reçoit un nouveau PID. Le moyen le plus simple de le supprimer consiste à supprimer le fichier exécutable. Si vous voulez rendre le processus plus malin, vous pouvez copier l'exécutable et le script pour vous assurer qu'il y a plusieurs copies sur le programme sur le disque à tout moment.
la source
system()
si les règles ne comptent pas un fork + exec/bin/sh
comme un programme supplémentaire.Perl
Le script émet une commande système pour se tuer et dirige le résultat vers une autre instance d'elle-même. L'interprète Perl est utilisé pour tuer, pour des raisons de plate-forme croisée.
Arrêtez la folie en supprimant le script.
la source
Atari 8 bits de base
Tokenizes to:
En interne, il nettoie les structures internes, essentiellement en supprimant le programme, avant de le réexécuter à partir de la liste.
Ceci est fondamentalement différent de:
Quel tokenize to:
Ceci est une boucle infinie de base. Lorsque vous les exécutez, vous voyez la différence de vitesse (la première est plus lente).
la source
LIST
, vous ne le verriez pas fonctionner. J'ai choisiLIST
parce qu'il a l'entrée la plus courteL.
. J'aime l'idée de mettre cela dans un tampon de clavier, c'est certainement assez court!Return
? Quelle est la taille de la mémoire tampon du clavier? Sur le VIC-20 et le C64, il s’agit de dix octets. Un programme qui fait assez de pokes pour charger la mémoire tampon du clavier ne rentrerait probablement pas dans la mémoire tampon du clavier, mais j’ai écrit des programmes qui se modifieraient eux-mêmes en imprimant les modifications à l’écran suivies deRUN
et en tapant quelquesReturn
touches. De telles choses étaient particulièrement utiles sur le 64 car il n'avait pas laIN
commande [IIRC] d' Atari pour fusionner des lignes dans un programme.Sur un mainframe IBM exécutant z / OS, vous exécutez un utilitaire qui copie un jeu de données (fichier) dans un autre jeu de données (fichier). L'entrée est la source du JCL (Job Control Language) que vous avez soumis afin de l'exécuter. La sortie est le lecteur interne (INTRDR). Vous devrez également vous assurer que votre système n'autorise pas l'exécution de plusieurs noms de travail identiques. Il est bon d'utiliser une classe de travail qui n'a qu'un seul initiateur (endroit où un travail peut être exécuté par lots).
Il n'y a pas de PID impliqué (dans z / OS), l'échec est donc impossible.
Vous arrêtez le processus en drainant et / ou en rinçant. Si quelque chose ne va pas, en vidant et / ou en rinçant, en jurant, en donnant un coup de pied, en essayant un démarrage à chaud et finalement par un démarrage à froid ou en appuyant sur le gros bouton rouge (et en tirant sur le programmateur).
J'ai peut-être exagéré en cours de route, mais n'essayez pas cela au travail ...
Exemple utilisant SORT. Les détails sur la carte de travail dépendent beaucoup du site. La politique du site peut interdire ou empêcher l’utilisation d’INTRDR. Une classe spécifique peut être nécessaire pour utiliser INTRDR. Si la politique de votre site interdit son utilisation , ne l'utilisez pas sauf si vous souhaitez vous promener avec vos biens personnels dans une boîte en carton.
Bien que l’INTRDR présente de bonnes utilisations, ne l’utilisez pas à cette fin . Vous n'aurez même pas la chance d'obtenir votre boîte.
D'autres utilitaires sont disponibles. Un programme rapide serait aussi facile à faire: il suffit de lire un fichier, d’écrire un fichier.
Si vous voulez un exemple d'erreur, essayez: http://ibmmainframes.com/viewtopic.php?p=282414#282414
La manière traditionnelle de copier un jeu de données consiste à utiliser l'utilitaire IBM IEBGENER, comme le fait remarquer ugoren dans ses commentaires.
Cependant, ces jours-ci, de nombreux sites auront IEBGENER "aliasé" par ICEGENER. Si cela est possible, ICEGENER utilisera DFSORT d’IBM (ou son rival SyncSort) pour effectuer une copie, car les produits SORT sont beaucoup plus optimisés pour IO que IEBGENER.
Je coupe juste l'intermédiaire en utilisant SORT.
Si vous travaillez sur un site IBM Mainframe, vous connaissez le format de la carte de travail que vous devez utiliser. La carte JOB minimale est comme je l’ai montré, sans le commentaire. Le commentaire sera important, car vous pouvez être supposé fournir des informations comptables, par exemple. Le nom du travail aura probablement un format spécifique au site.
Certains sites interdisent ou empêchent l’utilisation de INTRDR. Savoir.
Certains sites permettent l'exécution simultanée de plusieurs tâches du même nom. Savoir.
Bien que, sauf si vous êtes programmeur système, vous ne pouvez pas configurer une telle classe, vous devez rechercher une classe qui n'autorise qu'un seul initiateur. Avec cela, le processus est assez sûr - mais soyez absolument sûr que la classe fonctionne comme décrit. Tester. Pas avec ce travail.
Si vous êtes un programmeur système, vous savez qu'il ne faut rien faire en dehors de vos attributions. 'Nuff a dit.
Avec un travail portant le même nom autorisé en même temps et un seul initiateur, il s'agira d'un flux constant de début / fin de travail, début / fin du travail suivant, jusqu'à ce que vous remplissiez le spool (autre mauvaise chose à faire) avec la sortie de des milliers d'emplois (ou à court de nombre d'emplois). Surveillez une console JES pour les messages d'avertissement.
En gros, ne faites pas ça. Si vous le faites, ne le faites pas sur une machine de production.
Après un peu de relooking, je considérerai une autre réponse pour savoir comment le faire sur un autre système d'exploitation IBM Mainframe, z / VSE ... z / VSE utilise JCL. z / OS utilise JCL. Ils sont différents :-)
la source
IEBGENER
à l'époque pour simplement copier.Python (72 octets)
Pourrait être plus petit je suppose. Tout d'abord, en codant en dur le nom du fichier (au lieu d'utiliser
__file__
). Mais ici, vous pouvez mettre ce code dans un fichier et l'exécuter, quel que soit son nom :)la source
&&
pour&
.Planificateur de tâches Windows (.BAT)
Script batch Windows. Répond à toutes les exigences du défi.
Pour autant que je sache, il s’agit de la seule solution Windows à ce jour qui répond à toutes les exigences et ne présente aucune dépendance non standard (mon autre solution est similaire mais nécessite une compilation).
Le programme se comporte de la même manière que ma réponse C ++ / COM .
Le programme démarrera et enregistrera une tâche unique avec le planificateur de tâches Windows pour se lancer jusqu'à 60 secondes plus tard (Panneau de configuration -> Outils d'administration -> Planificateur de tâches à afficher, la tâche est nommée "Restarter"). Le programme s'interrompt pendant 5 secondes pour vous donner une chance de le tuer avant qu'il ne crée la tâche.
Utilise l'interface du planificateur de tâches en ligne de commande
schtasks.exe
. Dans le script, l'arithmétique consiste à calculer des décalages horaires tout en conservant l'heure valide et au format HH: MM.Exigences du défi:
Se remet en marche quand fini. Oui. La tâche est planifiée juste avant la sortie du programme.
Pas plus d'une instance du programme en cours d'exécution en même temps. Oui. Le programme se termine complètement et ne s'exécute pas pendant environ 60 secondes. Il est lancé par le planificateur.
Vous pouvez ignorer toute instance démarrée manuellement par l'utilisateur au cours de votre cycle. Oui, comme effet secondaire de l’utilisation d’un nom de tâche constant.
Tant qu'il est garanti que cela recommence. Oui, à condition que le planificateur de tâches soit en cours d'exécution et que schtasks.exe soit présent (les deux sont vrais dans les configurations Windows par défaut).
Le seul moyen d'arrêter le cycle est de tuer le processus. Oui, le processus peut être tué pendant la fenêtre de 5 secondes pendant son exécution. Le programme supprime la tâche avant le délai de 5 secondes. La tuer à ce moment-là ne laissera pas une tâche parasite dans le planificateur.
Votre solution ne devrait pas impliquer le redémarrage de l'environnement . Oui.
Remarque: en raison d'une interface de ligne de commande limitée, le temps de redémarrage doit être spécifié en minutes et la tâche ne redémarrera pas sur les ordinateurs portables sans l'adaptateur secteur branché (désolé).
la source
Shell Unix
Je n'ai pas encore vu beaucoup de solutions qui reposent sur un programme indépendant pour le redémarrer. Mais c’est exactement pour cela que cet
at(1)
utilitaire a été conçu:Il est difficile de suivre le programme en cours, car il ne s'exécute qu'une fois par minute et se termine si rapidement. Heureusement, l'
atq(1)
utilitaire vous montrera qu'il continue toujours:Et
atrm(1)
vous permettra de briser le cycle:Vous pouvez remplacer
1 minute
par1 hour
, ou1 week
. Ou donnez-lui1461 days
d'avoir un programme qui fonctionne une fois tous les 4 ans.la source
PowerShell
J'abuse (et éventuellement enfreint) ma propre règle.
Cela prend une quantité infinie de temps pour se relancer.
Il peut être tué en éliminant le processus hôte.
Attendez et voyez;)
la source
while true; do sleep 1; done
qualifie, n'est-ce pas?Frapper
Enregistrez-le sous le nom repeat.sh dans le répertoire / et donnez-lui l'autorisation d'exécution. Il peut être tué en supprimant le fichier
Cela fonctionne en mettant une entrée dans la crontab pour l'exécuter 1 minute plus tard.
la source
Visual Base 6 :)
Pour exécuter, créer un nouveau projet, ajouter un module avec ce code, définir l'objet de démarrage sur "Sub Main", compiler, puis exécuter le fichier exécutable.
Version plus lisible:
la source
HTML / JAVASCRIPT
FICHIER HTML a.html
la source
Frapper
Plus long que ça doit l'être, mais je suis fatigué et je m'en fiche :)
Vous avez dit qu'il doit se redémarrer à la fin, vous n'avez pas précisé qu'il devait le faire à répétition ou indéfiniment. En outre, vous avez dit qu'il ne devrait jamais y avoir deux instances en cours d'exécution à la fois ... jamais. ;)
Il y a beaucoup de façons de le faire. Mon choix personnel serait de faire quelque chose comme envoyer un paquet quelque part, et ensuite (via n'importe quel moyen), de faire en sorte que la réponse déclenche le processus.
la source
sleep
processus redémarre à la fin.Android: une alarme va redémarrer l'activité après 1 seconde
la source
Environnement C + MPI
mpifork.c:
Vous devez avoir OpenMPI ou une autre implémentation MPI installée.
Compiler avecMaintenant que j'y pense, il n'y a aucune raison pour que vous utilisiez mpicc - gcc ou le compilateur qui fonctionne. Vous devez juste avoir mpirun.Pour l'exécuter, vous devez probablement inclure le nom du chemin complet et inclure une liste d'hôtes. Par exemple, j'ai ajouté des entrées dans / etc / hosts qui pointaient toutes vers localhost et je les ai exécutées comme suit:
L'exécutable doit se trouver dans le même répertoire sur n'importe quel ordinateur sur lequel vous souhaitez l'exécuter.
Cela prend essentiellement une liste d'hôtes fournie sur la ligne de commande, sélectionne l'un des hôtes et lance l'exécutable sur l'hôte cible avec les mêmes arguments. Si tout se passe bien, mpirun s'appellera encore et encore sur différentes machines (ou sur la même machine si vous ne fournissez que 'localhost'. L'exécutable lui-même (mpifork) se termine. Après avoir appelé
execvp
, il ne s'exécute plus sur la première machine.Si vous vouliez être diabolique, vous pourriez plutôt lancer ce lancement sur chaque machine, en incluant la liste complète des hôtes fournie sur la ligne de commande
args
. Cela créerait une copie de lui-même sur chaque machine, encore et encore - un forkbomb en grappe.Cependant, sous cette forme, je suis à peu près sûr que cela satisfait aux règles.
la source
JavaScript
Sans "aller sur le réseau" quand cela n'est pas nécessaire :-) La planification de boucle d'événement de JavaScript nous permet d'écrire des programmes qui répondent aux exigences données très facilement:
Ceci "redémarre" la
program
fonction à un rythme de 10 fois par seconde. De par la nature de JavaScript, il est garanti qu'une seule tâche sera exécutée en même temps, et cela ne "redémarre pas l'environnement" comme dans "recharger la page".la source
Assemblée x86
Je ne suis pas tout à fait sûr que cela corresponde à vos critères car cela ne déclenche pas un nouveau processus, mais le voici quand même.
Le programme affichera une boîte de message, allouera de la mémoire, copiera sa propre section de code dans la mémoire allouée, puis passera à cet emplacement en commençant le cycle. Il devrait fonctionner jusqu'à ce que malloc échoue.
Compilé avec fasm.
la source
@
une requête ping une fois que vous avez réussi, car je ne garderai probablement pas mon œil dessus).Linux upstart init
À la lecture la plus stricte de la question, je pense que cela est impossible. Il s'agit essentiellement de demander à un programme de démarrer spontanément avec l'aide d'aucun autre programme en cours d'exécution.
Il y a quelques
at
et deschron
réponses à base, mais avec la lecture plus stricte,atd
etanacron
des programmes supplémentaires qui sont en cours d' exécution tout le temps, ils peuvent être disqualifiés.Une approche similaire, mais un peu plus bas consiste à utiliser celle de Linux
init
. En tant que root, ajoutez ce fichier .conf à/etc/init/
:Ensuite,
init
relisez ses fichiers .conf:Cela lancera un
sleep
processus qui durera 10 secondes, puis se terminera.init
réapparaîtrasleep
dès que le précédent sera détecté.Bien sûr, cela utilise toujours
init
comme programme supplémentaire. Vous pourriez soutenir queinit
c'est une extension logique du noyau et qu'il sera toujours disponible sous Linux.Si cela n’est pas acceptable, alors je suppose que la tâche la plus basse à faire est de créer un module de noyau qui réapparaîtra dans un processus utilisateur (vous ne savez pas à quel point cela est facile). Ici, on peut affirmer que le noyau n'est pas un processus, et donc pas un programme (supplémentaire). D'autre part, le noyau est un programme à part entière, du point de vue de la CPU.
la source
TI-BASIC: 5 caractères
appeler
prgmA
la source
:
s'agit que du symbole de début de ligne lorsque vous programmez dans TI-basic. Ce n'est pas quelque chose que vous tapez, c'est juste là dans l'éditeur.A
et d'utiliser une valeur comme base, vous verrez qu'il finira par sortir.