Напишите программу, которая запускается сама по окончании.
Должно быть не более одного экземпляра программы, запущенной одновременно. Даже на малейший момент времени.
Вы можете игнорировать любой экземпляр, который пользователь запускает вручную во время вашего цикла. Но ваш код не должен делать это в цикле перезапуска.
Программа может запуститься через любой промежуток времени, если гарантируется, что она запустится снова.
Единственный способ остановить цикл - убить процесс.
Ваше решение не должно включать перезапуск среды (в которой запущена программа, включая ОС, компьютер, виртуальную машину, оболочку и т. Д.). Только ваша программа может быть перезапущена.
popularity-contest
микробный
источник
источник
exec
делает в Linux?shutdown -r -t 0 -f
».Ответы:
Скрипт Bash, 3 символа (самый короткий, возможно, самый элегантный, хотя и по общему признанию спорный)
Просто помещает новый экземпляр себя в фоновом режиме (новый процесс), а затем выходит. Вероятно, новый экземпляр останется в очереди выполнения планировщика до тех пор, пока предыдущий экземпляр не будет создан.
Предупреждение - это сложно
kill
, так как PID постоянно меняется. Временное переименование файла сценария, вероятно, самый простой способ разорвать цикл.Предполагается одноядерная система. Конечно, это нереально с Linux на современном железном железе, но его легко настроить при работе на виртуальной машине. Вероятно, мы могли бы добиться аналогичного
taskset
эффекта, но это уменьшило бы влияние решения с тремя символами.Этот ответ немного отклоняет правила в том смысле, что он применяет определенное значение «бег». Будут моменты, когда новый процесс был
fork()
отредактирован, а старый процесс все еще жив, т.е. может быть возможно наблюдать более одного PID. Однако новый процесс будет помещен в очередь выполнения планировщика Linux для ожидания циклов ЦП, в то время как существующий процесс продолжит выполняться. На данный момент все, что должно быть сделано существующим процессом, дляbash
себяexit()
. Это занимает ограниченное количество времени, хотя я довольно уверен, что это будет сделано гораздо раньше, чем будет сделан текущий квант временного интервала / планировщика. Подтверждением тому является тот факт, чтоbash
на моей виртуальной машине запускается и выключается за 2 мс:Еще одно подтверждающее доказательство того, что новый процесс на самом деле не выполняется до тех пор, пока не будет выполнен предыдущий процесс, можно увидеть в
strace
выводеВ выводе мы видим, что исходный процесс имеет PID 6929. Мы можем видеть
fork()
вызов (на самом делеclone()
), который возвращает новый PID 6930. На данный момент есть 2 PID, но в настоящий момент работает только 6929:Полный
strace
вывод здесь.Мы видим, что 6930 не выполняет никаких системных вызовов, пока 6929 полностью не завершится. Разумно предположить, что это означает, что 6930 вообще не работает, пока не закончится 6929.
perf
Утилита будет лучшим способом доказать это.источник
top
это не тот инструмент, который можно использовать здесь. Однако я вижу, чтоtime bash -c :
на моей виртуальной машине Ubuntu это занимает всего 2 мс, поэтому я не думаю, что было бы неразумно ожидатьbash
завершения ее выключения до того, как будет произведен квант планирования.Решение 1
PHP, 32 символа
Он отправляет заголовок, а затем останавливается. Через 3 секунды страница перезагружается.
файл a.php
Это можно остановить, прекратив выполнение страницы перед отправкой заголовков, или просто убив браузер.
Решение 2
PHP, 2 страницы
Давайте рассмотрим два файла двух разных программ. Два файла находятся в одной папке.
файл a.php
файл b.php
Завершение одной из страниц перед отправкой заголовков завершает работу программы (также работает уничтожение браузера).
Вот та же программа в
ASP.NET
файл a.aspx
файл b.aspx
источник
ш
Это будет работать на любой Posix-совместимой системе.
Чтобы убить его, удалите файл или используйте
atrm
.источник
удар
exec
заменяет оболочку без создания нового процесса. Это гарантирует, что не может быть второго экземпляра.источник
~/.bash_profile
!$0
это-bash
когда.bash_profile
источник, так что это приведет к синтаксической ошибке.exec ${0##-}
в~/.bash_profile
работах :-)Планировщик заданий Windows (собственный)
C ++. Кошмар программирования COM. Отвечает всем требованиям вызова.
Скомпилируйте с MSVC (или MinGW GCC, если у вас есть все зависимости).
Программа запустится и зарегистрирует одноразовую задачу в планировщике задач Windows, чтобы запустить ее через 5 секунд (Панель управления -> Администрирование -> Планировщик задач для просмотра, задача называется «Перезагрузка»). Программа остановится на 5 секунд, чтобы дать вам шанс убить ее, прежде чем она создаст задачу.
Требования к соревнованиям:
Запускается снова, когда заканчивается. Да. Задача запланирована непосредственно перед выходом из программы.
Не более одного экземпляра программы, запущенной одновременно. Да. Программа завершается полностью и не запускается в течение 5 секунд. Запускается планировщиком.
Вы можете игнорировать любой экземпляр, который пользователь запускает вручную во время вашего цикла. Да, как побочный эффект от использования постоянного имени задачи.
Пока это гарантировано, что это начинается снова. Да, при условии, что Планировщик заданий работает (он находится в стандартной конфигурации Windows).
Единственный способ остановить цикл - убить процесс. Да, процесс может быть остановлен во время 5-секундного окна во время его работы. Программа удаляет задание до 5-секундной задержки, убивая его в это время, не оставит постороннее задание в планировщике.
Ваше решение не должно включать перезапуск среды. Да.
Кстати, если кто-то когда-нибудь задумывался над тем, почему приложения Windows были такими нестабильными (до появления .NET и C #), это одна из причин. Требуемый объем обработки ошибок (если бы я их включил), управление ресурсами и многословность создают ситуации, очень подверженные ошибкам, если программист даже немного ленив (немного выше кода очень ленив).
Гораздо проще и короче альтернатива, чтобы вызвать schtasks.exe. Я также представил версию с этим в сценарии .BAT .
источник
BBC BASIC - дань Snow Patrol
Эмулятор на bbcbasic.co.uk
Это немного по-другому. Он печатает стих песни «Run» и играет арпеджио аккордов, чтобы вы могли подпевать. Это было вдохновлено тем фактом, что команда для выполнения (и, следовательно, последняя строка программы), конечно, RUN.
Все переменные очищаются в начале программы, поэтому для выбора следующего стиха требуется цвет экрана, оставленный предыдущей итерацией.
ВЫХОД (монтаж 4 разных скриншотов)
источник
HTML / JavaScript:
Код запускает уничтожение страницы, на которой он работает, а затем воссоздание другого экземпляра самого себя, когда браузер загружает страницу заново.
AFAIK, единственный выход - убить вкладку, на которой работает страница.
РЕДАКТИРОВАТЬ: в соответствии с популярным запросом, действительный код HTML5:
источник
С
Эта программа действует как много вредоносных программ. Непосредственно перед закрытием он создает скрипт оболочки в каталоге / tmp. Он запускает сценарий оболочки, который позволяет исходной программе закрыть и отменить исходный PID. Через короткий промежуток времени (2 секунды) сценарий оболочки запускает новый процесс с программой. Для краткости местоположение программы жестко обозначено как «/ tmp / neverend /».
В каждый момент времени выполняется только один «бесконечный» процесс. Каждый новый процесс получает новый PID. Самый простой способ убить это - удалить исполняемый файл. Если вы хотите сделать его более злокачественным, вы можете скопировать как исполняемый файл, так и сценарий, чтобы в любой момент на диске было несколько копий программы.
источник
system()
если правила не считают fork + exec/bin/sh
в качестве дополнительной программы.Perl
Сценарий выдает системную команду, чтобы убить себя, и передать результат в другой экземпляр себя. Интерпретатор Perl используется для убийства по кросс-платформенным причинам.
Остановите безумие, удалив сценарий.
источник
Atari 8-битный базовый
Жетоны на:
Внутренне он очищает внутренние структуры, по сути стирая программу, прежде чем снова запустить ее из списка.
Это принципиально отличается от:
Который токенизирует:
Это основной бесконечный цикл. Когда вы их запускаете, вы видите разницу в скорости (сначала медленнее).
источник
LIST
, вы бы не увидели, что он работает. Я выбрал,LIST
потому что он имеет самый короткий входL.
. Мне нравится идея поместить это в буфер клавиатуры, это, конечно, достаточно коротко!Return
? Насколько большой буфер клавиатуры? На VIC-20 и C64 это десять байтов. Программа, которая делает достаточно ударов для загрузки буфера клавиатуры, вероятно, не помещалась бы в буфер клавиатуры, но я написал программы, которые изменяли бы себя, печатая изменения на экранеRUN
, а затем добавляли несколькоReturn
нажатий клавиш. Такие вещи были особенно полезны на 64, так как у него не было команды [IIRC], которуюIN
Atari имеет для слияния строк в программу.На мейнфрейме IBM, работающем с z / OS, вы запускаете утилиту, которая копирует набор данных (файл) в другой набор данных (файл). Входные данные - это источник JCL (языка управления заданиями), который вы отправили для запуска. Выход - внутренний ридер (INTRDR). Вам также необходимо убедиться, что ваша система не позволяет запускать несколько идентичных имен заданий. Хорошо использовать класс заданий, у которого есть только один инициатор (место, где JOB может работать в пакетном режиме).
Там нет задействованных PID (в z / OS), поэтому не удается установить вызов.
Вы останавливаете процесс, сливая и / или промывая. Если что-то пошло не так, слив и / или промывка, ругань, удар ногой, попытка горячего старта и, наконец, холодный старт или нажатие на большую красную кнопку (и стрельба в программиста).
Я мог бы преувеличить по пути, но не пытайтесь это на работе ...
Пример использования SORT. Детали карты JOB зависят от сайта. Политика сайта может запрещать или запрещать использование INTRDR. Для использования INTRDR может потребоваться определенный класс. Если политика вашего сайта запрещает его использование , не используйте его, если вы не хотите взять свои вещи на прогулку в картонной коробке.
Хотя для INTRDR есть хорошие применения, не используйте его для этой цели . У тебя даже не будет возможности получить свою коробку.
Другие утилиты доступны. Быструю программу было бы легко сделать, просто прочитайте файл, напишите файл.
Если вы хотите, чтобы пример этого был неправильным, попробуйте: http://ibmmainframes.com/viewtopic.php?p=282414#282414
Традиционный способ скопировать набор данных - это использовать служебную программу IBM IEBGENER, на которую ссылается Угорен в своем комментарии.
Однако в наши дни на многих сайтах IEBGENER будет добавлен псевдоним ICEGENER. ICEGENER, если сможет, будет использовать для копирования копию IBM DFSORT (или его конкурирующего SyncSort), потому что продукты SORT гораздо более оптимизированы для ввода-вывода, чем IEBGENER.
Я просто отключаю посредника, используя SORT.
Если вы работаете на сайте IBM Mainframe, вы знаете формат карты JOB, которую вам следует использовать. Минимальная JOB-карта, как я показал, без комментариев. Комментарий будет важен, потому что вы, возможно, должны предоставлять учетную информацию, например. Имя работы, скорее всего, будет иметь формат, специфичный для сайта.
Некоторые сайты запрещают или запрещают использование INTRDR. Быть в курсе
Некоторые сайты допускают одновременное выполнение нескольких заданий с одинаковым именем. Быть в курсе
Хотя, если вы не являетесь системным программистом, вы не можете создать такой класс, вам следует искать класс, который допускает только один инициатор. При этом процесс довольно безопасен - но будьте абсолютно уверены в том, что класс работает так, как описано. Тест. Не с этой работой.
Если вы являетесь системным программистом, вы знаете, что ничего не делаете за пределами своей компетенции. 'достаточно.
Если одно задание разрешено в одно и то же время и один инициатор, это будет постоянным потоком запуска / завершения следующего запуска / завершения следующего задания - до тех пор, пока вы не заполните катушку (еще одна плохая вещь) выводом из тысячи рабочих мест (или не хватает рабочих мест). Посмотрите консоль JES для предупреждений.
По сути, не делай этого. Если вы делаете это, не делайте этого на производственной машине.
Немного подведя итоги, я рассмотрю другой ответ о том, как это сделать в другой операционной системе IBM Mainframe: z / VSE ... z / VSE использует JCL. z / OS использует JCL. Они разные :-)
источник
IEBGENER
тогда, чтобы просто скопировать.Python (72 байта)
Я думаю, может быть меньше. Во-первых, путем жесткого кодирования имени файла (вместо использования
__file__
). Но здесь вы можете поместить этот код в файл и запустить его, как бы его ни звали :)источник
&&
на&
.Планировщик заданий Windows (.BAT)
Пакетный скрипт Windows. Отвечает всем требованиям вызова.
Насколько я вижу, это пока единственное решение для Windows, которое отвечает всем требованиям и не имеет нестандартных зависимостей (мое другое решение аналогично, но требует компиляции).
Программа ведет себя так же, как мой ответ C ++ / COM .
Программа запустится и зарегистрирует одноразовую задачу в планировщике задач Windows, которая запустится через 60 секунд (Панель управления -> Администрирование -> Планировщик задач для просмотра, задача называется «Перезагрузка»). Программа остановится на 5 секунд, чтобы дать вам шанс убить ее, прежде чем она создаст задачу.
Использует интерфейс командной строки Task Scheduler
schtasks.exe
. Арифметика в сценарии состоит в том, чтобы вычислять смещения времени, сохраняя время действительным и в формате ЧЧ: ММ.Требования к соревнованиям:
Запускается снова, когда заканчивается. Да. Задача запланирована непосредственно перед выходом из программы.
Не более одного экземпляра программы, запущенной одновременно. Да. Программа завершается полностью и не работает в течение ~ 60 секунд. Запускается планировщиком.
Вы можете игнорировать любой экземпляр, который пользователь запускает вручную во время вашего цикла. Да, как побочный эффект от использования постоянного имени задачи.
Пока это гарантировано, что это начинается снова. Да, при условии, что Планировщик заданий работает и присутствует файл schtasks.exe (оба имеют значение true в конфигурациях Windows по умолчанию).
Единственный способ остановить цикл - убить процесс. Да, процесс может быть остановлен во время 5-секундного окна во время его работы. Программа удаляет задание до 5-секундной задержки, убивая его в это время, не оставит постороннее задание в планировщике.
Ваше решение не должно включать перезапуск среды. Да.
Примечание. Из-за ограниченного интерфейса командной строки время перезапуска должно быть указано в минутах, и задача не будет перезапущена на ноутбуках без подключенного адаптера переменного тока (извините).
источник
Unix shell
Я еще не видел много решений, которые полагаются на несвязанную программу, чтобы перезапустить ее. Но это именно то, для чего
at(1)
была сделана утилита:На самом деле трудно поймать, как работает программа, поскольку она запускается раз в минуту и так быстро завершается. К счастью,
atq(1)
утилита покажет вам, что это все еще происходит:И
atrm(1)
позволит вам разорвать цикл:Вы можете заменить
1 minute
на1 hour
, или1 week
. Или дайте ему1461 days
иметь программу, которая запускается раз в 4 года.источник
PowerShell
Я злоупотребляю (и, возможно, нарушаю) свое собственное правило.
Требуется бесконечное количество времени, чтобы перезапустить себя.
Это можно убить, убив процесс хоста.
Просто подожди и увидишь ;)
источник
while true; do sleep 1; done
утешает, не так ли?удар
Сохраните его как repeat.sh в каталоге / и дайте ему разрешение на выполнение. Это можно убить, удалив файл
Это работает, помещая запись в crontab, чтобы запустить ее через 1 минуту.
источник
Visual Base 6 :)
Для запуска создайте новый проект, добавьте модуль с этим кодом, установите для объекта запуска «Sub Main», скомпилируйте и запустите исполняемый файл.
Более читаемая версия:
источник
HTML / JAVASCRIPT
HTML-файл a.html
источник
удар
Дольше, чем должно быть, но я устал, и мне все равно :)
Вы сказали, что он должен перезапустить себя, когда закончится, вы не сказали, что он должен был делать это многократно или бесконечно. Кроме того, вы сказали, что никогда не должно быть запущено два экземпляра одновременно ... никогда не будет. ;)
Есть много способов сделать это. Моим личным фаворитом было бы сделать что-то вроде отправки пакета куда-то далеко, а затем (с помощью любого количества методов) получить ответ, запускающий процесс.
источник
sleep
процесс возобновляется после его завершенияAndroid: будильник перезапустит активность через 1 секунду
источник
C + MPI Environment
mpifork.c:
У вас должен быть установлен OpenMPI или другая реализация MPI.
Компилировать сТеперь, когда я думаю об этом, нет никакой причины, по которой вы должны использовать mpicc-gcc или любой другой компилятор, который будет работать. Вы просто должны иметь mpirun.Чтобы запустить его, вам, вероятно, следует указать полный путь и список хостов. Например, я добавил некоторые записи в / etc / hosts, которые все указывали на localhost, и запустил его так:
Исполняемый файл должен находиться в том же каталоге на любом компьютере, на котором вы хотите его запустить.
По сути, это берет список хостов, предоставленных в командной строке, выбирает один из хостов и запускает исполняемый файл на целевом хосте с теми же аргументами. Если все идет отлично, mpirun будет вызывать себя снова и снова на разных машинах (или на одной и той же машине, если вы предоставите только localhost). Сам исполняемый файл (mpifork) завершается - после вызова
execvp
он больше не выполняется на первой машине.Если вы хотите быть злым, вы можете вместо этого сделать этот запуск на каждой машине, включив полный список хостов, предоставленный в командной строке в
args
. Это снова и снова будет создавать свою копию на каждой машине - кластерную бомбу.Тем не менее, в этой форме, я уверен, что это удовлетворяет правилам.
источник
JavaScript
Без необходимости «заходить в сеть», когда в этом нет необходимости :-) Планирование цикла событий JavaScript позволяет нам писать программы, которые очень легко удовлетворяют заданным требованиям:
Это «перезапускает»
program
функцию с частотой 10 раз в секунду. По своей природе JavaScript гарантирует, что одновременно будет выполняться только одна задача, и он не «перезапускает среду», как в «перезагрузке страницы».источник
Сборка x86
Не совсем уверен, что это соответствует вашим критериям, поскольку это не порождает новый процесс, но здесь это в любом случае.
Программа покажет окно сообщения, выделит некоторое количество памяти, скопирует свой собственный фрагмент кода в выделенную память и затем перейдет в это место, начиная цикл заново. Это должно работать, пока malloc не терпит неудачу.
Составлено с помощью фасма.
источник
@
только вы справитесь, так как я, вероятно, не буду следить за этим).Linux upstart init
Учитывая строжайшее прочтение вопроса, я думаю, что это невозможно. По сути, это запрос на самопроизвольный запуск программы без помощи других запущенных программ.
Есть некоторые
at
иchron
основанные на ответах, но с самым строгим чтением,atd
иanacron
это дополнительные программы, которые работают все время, поэтому они могут быть дисквалифицированы.Связанный подход, но немного более низкий уровень - это использование Linux
init
. В качестве пользователя root добавьте этот файл .conf в/etc/init/
:Затем
init
перечитайте его .conf файлы:Это запустит
sleep
процесс, который будет жить 10 секунд, а затем выйдет.init
затем возродится, какsleep
только он обнаружит, что предыдущий ушел.Конечно, это все еще используется
init
в качестве дополнительной программы. Можно утверждать, чтоinit
это логическое расширение ядра, которое всегда будет доступно в любом Linux.Если это неприемлемо, то я думаю, что следующим шагом на более низком уровне будет создание модуля ядра, который запускает процесс пользовательского пространства (не уверен, насколько это просто). Здесь можно утверждать, что ядро не является процессом и, следовательно, не является программой (дополнительной). С другой стороны, ядро - это отдельная программа с точки зрения процессора.
источник
TI-BASIC: 5 символов
назови это
prgmA
источник
:
просто начало символа линии, когда вы программируете на TI-basic. Это не то, что вы вводите, а просто в редакторе.A
и использовать его в качестве базового варианта, в конце концов вы увидите, что оно выходит.