終了するが終了しないプログラム[クローズ]


35

終了時に再び自動的に起動するプログラムを作成します。

同時に実行されているプログラムのインスタンスは1つだけにする必要があります。ほんの一瞬でも。

サイクル中にユーザーが手動で開始したインスタンスは無視できます。しかし、コードは再起動サイクルでそれを行うべきではありません。

プログラムは、再開することが保証されている限り、任意の時間の後に開始できます。

サイクルを停止する唯一の方法は、プロセスを強制終了することです。

ソリューションには、環境(OS、マシン、VM、シェルなどを含むプログラムが実行されている)の再起動を含めないでください。プログラムのみが再起動できます。


11
これexecは、Linuxの機能だけではありませんか?
mniip 14

11
私は今それを書くのが少し面倒ですが、私の提出は(Windowsの場合):「レジストリを編集して、起動時にプログラムが起動するようにします。実行しますshutdown -r -t 0 -f」。
ランチャー14

3
プロセスを強制終了しても、サイクルは強制終了されません。
ミクロ

19
気付いたのは、ウイルスを書きたいのにどうしたらいいかわからない場合は、1)StackOverflowにアクセスして、方法を尋ねることです。皆から憎しみを得ると、おそらく質問は閉じられます。または2)ゴルフをコーディングし、他の人にどうやってそれをするか尋ねます。いくつかのクリエイティブな回答を選択して選択すると、質問は非常に人気があり、ネットワーク全体の「ホット」リストに載ります。ムアハハハハ。
rumtscho

5
@rumtschoご存知のように、それは良い一般的な戦略です。では、次の課題として、リンクされたドキュメントのすべての要件を満たす、机の上にあるプロトタイプデバイス用の最小のファームウェアを誰が作成できるかを見てみましょう。スパイスを加えるには、月曜日の午前8時までにこれを行う必要があります。行け!
ジェイソンC 14

回答:


50

Bashスクリプト、3文字(最短ですが、おそらく最もエレガントですが、議論の余地はありますが)

$0&

単にそれ自体の新しいインスタンスをバックグラウンド(新しいプロセス)に配置してから終了します。新しいインスタンスは、前のインスタンスが完了するまでスケジューラの実行キューに残る可能性があります。

警告kill-PIDは絶えず変化しているため、これは困難です。一時的にスクリプトファイルの名前を変更することが、おそらくサイクルを壊す最も簡単な方法です。

シングルコアシステムが想定されています。もちろん、これは最新のベアメタルハードウェア上のLinuxでは現実的ではありませんが、VMで実行する場合は簡単に構成できます。おそらくを使用して同様のトリックを達成できますtasksetが、3文字ソリューションの影響は軽減されます。

この答えは、「実行」という特定の意味を適用するという点で、少し規則を曲げます。新しいプロセスがfork()編集され、古いプロセスがまだ生きている瞬間があります。つまり、複数のPIDを監視できる場合があります。ただし、新しいプロセスはLinuxスケジューラの実行キューに配置され、CPUサイクルを待機しますが、既存のプロセスは引き続き実行されます。この時点で、既存のプロセスで実行する必要があるのは、bashそれ自体exit()です。これには時間がかかりますが、現在のタイムスライス/スケジューラクォンタムが実行される前に実行されると確信しています。裏付けとなる証拠はbash、VMで2ミリ秒で起動およびシャットダウンするという事実です。

$ time bash -c:

実際の0m0.002s
ユーザー0m0.000s
sys 0m0.000s
$ 

前のプロセスが完了するまで新しいプロセスが実際に実行されないというさらなる証拠は、strace出力で確認できます。

strace -f -tt -o forever.strace bash -c ./forever.sh 

出力では、元のプロセスにはPID 6929があります。fork()呼び出し(実際にはclone())を見ると、6930の新しいPIDが返されます。この時点で2つのPIDがありますが、6929だけが現在実行中です。

6929 12:11:01.031398 clone(child_stack = 0、flags = CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | SIGCHLD、child_tidptr = 0x7f2f83ac49d0)= 6930
6929 12:11:01.031484 rt_sigprocmask(SIG_SETMASK、[]、NULL、8)= 0
6929 12:11:01.031531 rt_sigprocmask(SIG_BLOCK、[CHLD]、[]、8)= 0
6929 12:11:01.031577 rt_sigprocmask(SIG_BLOCK、[CHLD]、[CHLD]、8)= 0
6929 12:11:01.031608 rt_sigprocmask(SIG_SETMASK、[CHLD]、NULL、8)= 0
6929 12:11:01.031636 rt_sigprocmask(SIG_BLOCK、[CHLD]、[CHLD]、8)= 0
6929 12:11:01.031665 rt_sigprocmask(SIG_SETMASK、[CHLD]、NULL、8)= 0
6929 12:11:01.031692 rt_sigprocmask(SIG_BLOCK、[CHLD]、[CHLD]、8)= 0
6929 12:11:01.031726 rt_sigprocmask(SIG_SETMASK、[CHLD]、NULL、8)= 0
6929 12:11:01.031757 rt_sigprocmask(SIG_SETMASK、[]、NULL、8)= 0
6929 12:11:01.031803 rt_sigprocmask(SIG_BLOCK、NULL、[]、8)= 0
6929 12:11:01.031841 read(255、 ""、4)= 0
6929 12:11:01.031907 exit_group(0)=?
6930 12:11:01.032016 close(255)= 0
6930 12:11:01.032052 rt_sigprocmask(SIG_SETMASK、[]、NULL、8)= 0

straceここに完全な出力。

6929が完全に完了するまで、6930はシステムコールを発行しないことがわかります。これは、6929が完了するまで6930がまったく実行されないことを意味すると想定するのが妥当です。perfユーティリティは、これを証明するための究極の方法だろう。


21
「再起動してから終了する」ので、複数のインスタンスが同時に実行されていますか?
ミクロ

4
「...シングルコアで」-はい、私もそう思うでしょう。メニーコアでは、おそらく多くを見ることができるかもしれません。
blabla999 14

3
これがcode-golfとタグ付けされている場合、これは間違いなく勝ちます!+1
ジョンオドム14

3
@DigitalTraumaあなたは、bashがそれ自身をシャットダウンするのにどれくらい時間がかかるかについて、大きな仮定をしています。topは何も伝えません-数秒(10秒間)に1回しか更新しませんが、1秒あたり多くのプロセスを生成しています。
デビッドリチャービー14

2
@DavidRicherby-あなたは絶対に正しい- topここで使用する適切なツールではありません。ただしtime bash -c :、Ubuntu VMでは2ミリ秒しかかからないのでbash、スケジューリングクォンタムが完了する前にシャットダウンを完了するのは無理だとは思いません。
デジタル外傷14

26

解決策1

PHP、32文字

ヘッダーを送信してから停止します。3秒後、ページがリロードされます。

ファイルa.php

header("Refresh: 3; url=a.php");

これは、ヘッダーが送信される前にページの実行を終了するか、単にブラウザーを強制終了することで停止できます。


解決策2

PHP、2ページ

2つのファイルと2つの異なるプログラムを考えてみましょう。2つのファイルは同じフォルダーにあります。

ファイルa.php

header("Location:b.php");

ファイルb.php

header("Location:a.php");

ヘッダーが送信される前にページの1つを終了すると、プログラムが終了します(ブラウザーも強制終了します)。

ここに同じプログラムがあります

ASP.NET

ファイルa.aspx

Response.Redirect("b.aspx")

ファイルb.aspx

Response.Redirect("a.aspx")

1
それは素晴らしい解決策です。他の人がこれとは異なる答えを持って来ることを願っています だから、私はそれを人気コンテストとして続けました。
ミクロ

3秒間のリロードの答えが有効かどうかは、PHPの専門家にお任せします。あなたのPHPではなくブラウザが待っているので、私はそれが有効だと思う(私は専門家ではない)。
ミクロ

1
技術的にはPHPはWebサーバーのモジュールとして実行され、Webサーバーは再起動しませんでしたが、.phpファイルをスクリプトと見なし、スクリプトを複数回実行すると有効だと思います。
TwiNight 14

@TwiNightフィードバックをありがとう、私はそれを感謝します:)
Vereos 14

2
2番目の解決策として、ブラウザーはリダイレクトループを検出し、自動的に停止しませんか?thedan1984.com/wp-content/uploads/2012/02/...
Ajedi32

19

sh

echo $PWD/$0 | at tomorrow

これは、Posix準拠のシステムで動作します。

強制終了するには、ファイルを削除するか、を使用しますatrm


17

バッシュ

exec "$0"

exec新しいプロセスを作成せずにシェルを置き換えます。これにより、2番目のインスタンスが存在しないようになります。


1
入れたほうが~/.bash_profileいい!
yegle 14

@yegle:$0され-bashたときに.bash_profile供給され、そのためには、単に構文エラーになります。
デニス14

おっと、あなたは正しい。
yegle 14

exec ${0##-}~/.bash_profile作品:-)
yegle

14

Windowsタスクスケジューラ(ネイティブ)

C ++。COMプログラミングの悪夢。すべてのチャレンジ要件を満たしています。

#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <taskschd.h>
#include <comutil.h>

#pragma comment(lib, "taskschd.lib")
#pragma comment(lib, "comsuppw.lib")    

static void timeplus (int seconds, char timestr[30]);


int main () {

    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    CoInitializeSecurity(NULL, -1, NULL, NULL,
        RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
        RPC_C_IMP_LEVEL_IMPERSONATE, NULL, 0, NULL);

    const char *name = "Restarter";

    char path[MAX_PATH + 1];
    GetModuleFileNameA(NULL, path, sizeof(path));
    path[sizeof(path) - 1] = 0; // workaround for xp

    ITaskService *taskman;
    CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER,
        IID_ITaskService, (void **)&taskman);

    taskman->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t());

    ITaskFolder *root;
    taskman->GetFolder(_bstr_t("\\"), &root);

    // Delete the task.
    root->DeleteTask(_bstr_t(name), 0);

    // pause for 5 seconds to give user a chance to kill the cycle
    fprintf(stderr, "If you want to kill the program, close this window now.\n");
    Sleep(5000);
    fprintf(stderr, "Sorry, time's up, maybe next time.\n");

    // Create the task for 5 seconds from now.
    ITaskDefinition *task;
    taskman->NewTask(0, &task);

    IPrincipal *principal;
    task->get_Principal(&principal);
    principal->put_LogonType(TASK_LOGON_INTERACTIVE_TOKEN);

    ITaskSettings *settings;
    task->get_Settings(&settings);
    settings->put_StartWhenAvailable(VARIANT_TRUE);
    settings->put_DisallowStartIfOnBatteries(VARIANT_FALSE);
    settings->put_StopIfGoingOnBatteries(VARIANT_FALSE);

    ITriggerCollection *triggers;
    task->get_Triggers(&triggers);

    ITrigger *trigger;
    triggers->Create(TASK_TRIGGER_TIME, &trigger);

    char when[30];
    ITimeTrigger *trigger_time;
    trigger->QueryInterface(IID_ITimeTrigger, (void **)&trigger_time);
    trigger_time->put_Id(_bstr_t("TimeTrigger"));
    timeplus(10, when);
    trigger_time->put_StartBoundary(_bstr_t(when));
    timeplus(300, when);
    trigger_time->put_EndBoundary(_bstr_t(when));

    IActionCollection *actions;
    task->get_Actions(&actions);

    IAction *action;
    actions->Create(TASK_ACTION_EXEC, &action);

    IExecAction *action_exec;
    action->QueryInterface(IID_IExecAction, (void **)&action_exec);
    action_exec->put_Path(_bstr_t(path));

    IRegisteredTask *regtask;
    root->RegisterTaskDefinition(_bstr_t(name), task,
        TASK_CREATE_OR_UPDATE, _variant_t(), _variant_t(),
        TASK_LOGON_INTERACTIVE_TOKEN, _variant_t(""),
        &regtask);

    regtask->Release();
    action_exec->Release();
    actions->Release();
    trigger_time->Release();
    trigger->Release();
    triggers->Release();
    settings->Release();
    principal->Release();
    task->Release();
    root->Release();
    taskman->Release();
    CoUninitialize();

}


// outputs current utc time + given number of seconds as 
// a string of the form YYYY-MM-DDTHH:MM:SSZ
static void timeplus (int seconds, char timestr[30]) {

    SYSTEMTIME when;
    FILETIME whenf;
    LARGE_INTEGER tempval;

    GetSystemTimeAsFileTime(&whenf);
    tempval.HighPart = whenf.dwHighDateTime;
    tempval.LowPart = whenf.dwLowDateTime;
    tempval.QuadPart += seconds * 10000000LL; // 100 nanosecond units
    whenf.dwHighDateTime = tempval.HighPart;
    whenf.dwLowDateTime = tempval.LowPart;
    FileTimeToSystemTime(&whenf, &when);

    sprintf(timestr, "%04hu-%02hu-%02huT%02hu:%02hu:%02huZ",
        when.wYear, when.wMonth, when.wDay,
        when.wHour, when.wMinute, when.wSecond);

}

MSVC(またはすべての依存関係がある場合はMinGW GCC)でコンパイルします。

プログラムは、Windowsタスクスケジューラに1回限りのタスクを開始して登録し、5秒後に開始します([コントロールパネル]-> [管理ツール]-> [表示するタスクスケジューラ。タスクの名前は「リスターター」)。プログラムは5秒間一時停止して、タスクを作成する前にプログラムを強制終了する機会を与えます。

チャレンジ要件:

  • 終了すると、自動的に再起動します。 はい。タスクはプログラム終了の直前にスケジュールされます。

  • 同時に実行されるプログラムのインスタンスは1つだけです。 はい。プログラムは完全に終了し、5秒間実行されません。スケジューラーによって開始されます。

  • サイクル中にユーザーが手動で開始したインスタンスは無視できます。 はい、一定のタスク名を使用する副作用として。

  • 再び開始することが保証されている限り。 はい。ただし、タスクスケジューラが実行されている場合(標準のWindows構成内)。

  • サイクルを停止する唯一の方法は、プロセスを強制終了することです。 はい、実行中の5秒間にプロセスを強制終了できます。プログラムは、5秒の遅延の前にタスクを削除します。この時点でタスクを強制終了しても、スケジューラーに浮遊タスクが残ることはありません。

  • ソリューションには、環境の再起動は含まれません はい。

ちなみに、Windowsアプリケーションが(.NETとC#が登場する前に)なぜこれほど不安定であるのかと疑問に思った人がいたなら、これが理由の1つです。必要なエラー処理の量(私がそれを含めていた)、リソース管理、および冗長性は、プログラマーがほんの少し怠けている場合でもエラーが発生しやすい状況をセットアップします(上記のコードは非常に怠zyです)。

はるかに簡単で短い代替手段は、schtasks.exeを呼び出すことです。.BATスクリプトでも同じバージョンを送信しました


13

BBC BASIC-Snow Patrolへのオマージュ

bbcbasic.co.ukのエミュレーター

これは少し違います。歌「Run」の詩を印刷し、和音のアルペジオを演奏するので、一緒に歌うことができます。実行するコマンド(したがってプログラムの最後の行)がもちろんRUNであるという事実に触発されました。

すべての変数はプログラムの開始時にクリアされるため、前の反復で残された画面の色を使用して、次に印刷する詩を決定します。

    5 C=POINT(0,0) MOD 4
   10 COLOUR 129+C
   15 CLS
   20 RESTORE 110+C
   25 READ A$
   30 PRINT A$
   35 FORK = 1 TO 4
   40   RESTORE K+100
   45   READ P
   50   FORM= 1 TO 8
   55     SOUND 1,-15,P,7
   60     SOUND 1,-15,P-20,7
   65   NEXT
   70 NEXT
  101 DATA 100
  102 DATA 128
  103 DATA 136
  104 DATA 120
  110 DATA Light up light up - As if you have a choice - Even if you can not hear my voice - I'll be right beside you dear.
  111 DATA Louder louder - And we'll run for our lives - I can hardly speak - I understand - Why you can't raise your voice to say.
  112 DATA Slower Slower - We dont have time for that - All I want is to find an easier way - To get out of our little heads.
  113 DATA Have heart my dear - We're bound to be afraid - Even if its just for a few days - Makin' up for all of this mess.
  120 RUN

OUTPUT(4つの異なるスクリーンショットのモンタージュ)

enter image description here


「共有メモリ」代替としてのカラーソリューションの場合は+1。
ヨハネスH. 14

11

HTML / JavaScript:

<form /><script>document.forms[0].submit()</script>

コードは、実行中のページの破棄をトリガーし、ブラウザーがページを新たにロードすると、それ自体の別のインスタンスの再作成をトリガーします。

知る限り、唯一の方法は、ページが実行されているタブを強制終了することです。

編集:一般的なリクエストによると、有効なHTML5コード:

<!doctype html><meta charset=utf-8><title> </title><form></form>
<script>document.forms[0].submit()</script>

@JasonC私は同意しません。妥当なページは仕様に準拠する必要があると思いますが、人気コンテストはかなり合理的であるはずですよね?:D so +1、私はこれが本当に好きです。
よ」

10

C

このプログラムは、多くのマルウェアのように機能します。終了する直前に、/ tmpディレクトリにシェルスクリプトを作成します。元のプログラムを閉じて元のPIDをキャンセルできるシェルスクリプトを起動します。短時間(2秒)後、シェルスクリプトはプログラムで新しいプロセスを開始します。簡潔にするために、プログラムの場所は「/ tmp / neverend /」として固定されています。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

void rebirth(){
    char t[] = "/tmp/pawnXXXXXX";
    char* pawnfile = mktemp(t);
    if(pawnfile){
        int fd = open(pawnfile, O_RDWR|O_CREAT);
        const char msg[]="sleep 2\n/tmp/neverend\n";
        if(fd>0){
            int n = write(fd, msg, sizeof(msg));
            close(fd);
            pid_t pid = fork();
            if(pid==0){
                char* args[3] = {"bash", pawnfile, NULL};
                execvp(args[0], args);
            }
        }
    }
}

int main(int argc, char* argv[]){
    printf("Starting %s\n", argv[0]);
    atexit(rebirth);
    printf("Exiting %s\n", argv[0]);
}

一度に実行される「ネバーエンド」プロセスは1つだけです。新しいプロセスはそれぞれ新しいPIDを取得します。これを殺す最も簡単な方法は、実行可能ファイルを削除することです。より悪性にしたい場合は、実行可能ファイルとスクリプトの両方をコピーして、ディスク上のプログラムにいつでも複数のコピーがあることを確認できます。


1
私はより革新的な答えを期待しています。「補足プログラム」に関する質問のコメントを参照してください。私にとって、サプリメントプログラムは、プログラムの一部にすぎません。
ミクロ

4
分岐とは、プロセスが異なることを行っている場合でも、プロセスの2つのインスタンスが同時に実行されることを意味します。
バリーフルーツマン14

@BarryFruitmanは、2つの異なる実行可能ファイルを実際に使用することで簡単に回避できます。それはその後有効ですが、あまりエレガントではありません。
ヨハネスH. 14

system()ルールがfork + execを/bin/sh補助プログラムとしてカウントしない場合に使用できると思います。
ジェイソンC 14

10

Perl

`perl -e"kill 9,$$"|perl $0`

スクリプトは、システムコマンドを発行して自分自身を強制終了し、結果を別のインスタンスにパイプします。クロスプラットフォームの理由から、Perlインタープリターを使用して強制終了します。

スクリプトを削除して狂気を止めます。


7

Atari 8ビットベーシック

1L.:R.

トークン化:

1 LIST : RUN

内部的には、リストから再度実行する前に、内部構造をクリアし、本質的にプログラムを消去します。

これは根本的に次とは異なります。

1L.:G.1

トークン化するもの:

1 LIST : GOTO 1

これは基本的な無限ループです。それらを実行すると、速度の違いがわかります(最初のほうが遅くなります)。


プログラムの実行中に「リスト」が内部構造をクリアする理由はよくわかりません。Atariにはキーボードバッファーがあるため、プログラムを一覧表示し、キーストロークを詰め込んで実行し、カーソルを「再入力」する位置に「新規」を作成できます。
supercat

@supercat-LISTではなく、RUNです。

そのロジックにより、「LIST」を省略することができます。一方、プログラムがキーボードバッファーを詰めて、キャリッジリターンを少し入れ、画面の適切な場所に「NEW」、続いてプログラム、「RUN」を配置し、カーソルを置いて終了すると、それ自体が完全に消去されます。自動的に再入力します。
supercat 14

@supercat-なしではLIST、実行されません。私が選んだのLISTは、入力が最も短いからL.です。私はそれをキーボードバッファーに入れるというアイデアが好きです、それは確かに十分に短いです!

Commodoreマシンのように、Atariを押すと、画面からテキストが読み取られることを正しく覚えていますReturnか?キーボードバッファーの大きさは?VIC-20およびC64では、10バイトです。キーボードは、おそらくバッファにロードするのに十分なポークを行うプログラムは、キーボードバッファに収まらないだろうが、私は続い画面への変更印刷することによって、自分自身を修正するだろうプログラム書いたRUN、とか、いくつかのReturnキーストロークを。このようなことは、64で特に便利でしINた。アタリが行をプログラムにマージするための[IIRC] コマンドを持っていなかったからです。
supercat 14

5

z / OSを実行しているIBMメインフレームで、データセット(ファイル)を別のデータセット(ファイル)にコピーするユーティリティを実行します。入力は、実行させるために送信したJCL(ジョブ制御言語)のソースです。出力は内部リーダー(INTRDR)です。また、システムが複数の同一のジョブ名の実行を許可しないようにする必要があります。イニシエーターが1つしかないジョブクラス(JOBをバッチで実行できる場所)を使用すると便利です。

(z / OSでは)PIDが関係しないため、チャレンジセットは失敗します。

排出またはフラッシュ、あるいはその両方によってプロセスを停止します。排水やフラッシュ、宣誓、蹴り、ウォームスタートの試み、最後にコールドスタートまたはビッグレッドボタンを押す(そしてプログラマーを撃つ)ことによって、何かがうまくいかなかった場合。

私は途中で誇張したかもしれませんが、職場でこれを試さないでください...

SORTを使用した例。JOBカードの詳細は、サイトによって大きく異なります。サイトポリシーにより、INTRDRの使用が禁止または防止される場合があります。INTRDRを使用するには、特定のクラスが必要になる場合があります。サイトポリシーでその使用禁止されている場合、持ち物を段ボール箱に入れて持ち歩きたい場合を除き、使用しないでください。

INTRDRには優れた用途がありますが、この目的には使用しないください。箱を手に入れる機会さえありません。

//jobname JOB rest is to your site standards
//* 
//STEP0100 EXEC PGM=SORT 
//SYSOUT   DD SYSOUT=* 
//SORTOUT  DD SYSOUT=(,INTRDR) minimum required, site may require more 
//SYSIN    DD * 
  OPTION COPY 
//SORTIN   DD DISP=SHR,DSN=YOUR.LIBRARY.WITHJOB(JOBMEMBR) 

他のユーティリティが利用可能です。ファイルを読み取り、ファイルを書き込むだけで、簡単なプログラムも簡単に実行できます。

これがうまくいかない例が必要な場合は、http//ibmmainframes.com/viewtopic.php?p = 282414#282414を試してください。

データセットをコピーする従来の方法は、コメントで言及されているように、IBMユーティリティIEBGENERを使用することです。

ただし、最近では、多くのサイトでIEBGENERがICEGENERに「エイリアス」されます。可能であれば、ICEGENERはIBMのDFSORT(またはライバルのSyncSort)を使用してコピーを実行します。これは、SORT製品がIEBGENERよりもIOに対してはるかに高度に最適化されているためです。

SORTを使用して仲介者を切り取っています。

IBM Mainframeサイトで作業している場合、使用する必要のあるJOBカードのフォーマットを知っています。最小限のJOBカードは、コメントなしで示したとおりです。たとえば、会計情報を提供することになっている可能性があるため、コメントは重要です。ジョブ名は、おそらくサイト固有の形式になります。

一部のサイトでは、INTRDRの使用を禁止または防止しています。注意してください。

一部のサイトでは、同じ名前の複数のジョブを同時に実行できます。注意してください。

あなたがシステムのプログラマーでない限り、そのようなクラスをセットアップすることはできませんが、イニシエーターを1つだけ許可するクラスを探す必要があります。これにより、プロセスはかなり安全になります-ただし、クラスが説明どおりに機能していることを絶対に確認してください。テスト。この仕事ではありません。

あなたがシステムのプログラマである場合、あなたはあなたの権限外で何もしないことを知っています。'言っ途切れる。

同時に許可される同じ名前の1つのジョブと単一のイニシエーターでは、これはジョブ開始/終了の次のジョブ開始/終了の一定のストリームになります-スプール(別の悪いこと)からの出力でいっぱいになるまで数千のジョブ(またはジョブ番号を使い果たす)。JESコンソールで警告メッセージを確認してください。

基本的に、これをしないでください。実行する場合は、実稼働マシンでは実行しないでください。

少し磨きをかけて、別のIBMメインフレームオペレーティングシステムであるz / VSE ... z / VSEでJCLを使用する方法について、別の回答を検討します。z / OSはJCLを使用します。彼らは違う :-)


アイデアはよさそうですが、それは答えではありません。JCL-JOB、EXEC、DD-を見せてください。それが答えになります。
ウゴレン14

ひどく長い間仕事を提出していないので、私はそれをどうするかわからない。不足している部分がローカルカスタマイズのみの場合は、OKです。しかし、虐待を防ぐために物を隠すなら、心構えをしてください-本物を投稿するか、何も投稿しないでください。PS IEBGENER当時は単純にコピーするために使用していました。
ウゴレン14

@ugoren IEBGENERがタスクに選択されなかった理由の説明など、さらなる更新。JOBステートメントのコメントテキストを削除すると、実行に必要なJCLが得られますが、JCLが十分であるかどうかは、ジョブが機能するか、プログラマーが解雇されるのを避けるためのローカルサイトの標準に依存します。
ビル・ウッドジャー14

4

Python(72バイト)

import os
os.system('kill -9 %s && python %s' % (os.getpid(), __file__))

小さくすることができると思います。まず、ファイル名をハードコーディングします(代わりに__file__)。しかし、ここでは、このコードをファイルに入れて実行することができます。


あなたは、おそらく変更することができます&&&
Hosch250 14

1
いつそれが許可されているので、user2509848?
ライモイド14

さて、あなたは...空白を削除することによって開始することができます
Ry-

6
code-golfのタグが付いていないため、このようなコードを保持します:-)
Maxime Lorant 14

4

Windowsタスクスケジューラ(.BAT)

Windowsバッチスクリプト。すべてのチャレンジ要件を満たしています。

私の知る限り、これはすべての要件を満たし、非標準の依存関係を持たない唯一のWindowsソリューションです(他のソリューションも同様ですが、コンパイルが必要です)。

@ECHO OFF
SETLOCAL

schtasks /Delete /TN RestarterCL /F

ECHO Close this window now to stop.
TIMEOUT /T 5

FOR /f "tokens=1-2 delims=: " %%a IN ("%TIME%") DO SET /A now=%%a*60+%%b
SET /A start=%now%+1
SET /A starth=100+(%start%/60)%%24
SET /A startm=100+%start%%%60
SET /A end=%now%+3
SET /A endh=100+(%end%/60)%%24
SET /A endm=100+%end%%%60

schtasks /Create /SC ONCE /TN RestarterCL /RI 1 /ST %starth:~1,2%:%startm:~1,2% /ET %endh:~1,2%:%endm:~1,2% /IT /Z /F /TR "%~dpnx0"

ENDLOCAL

プログラムは、私のC ++ / COM answerと同様に動作します

プログラムは、Windowsタスクスケジューラに1回限りのタスクを開始して登録し、最大60秒後に開始します(コントロールパネル->管理ツール->表示するタスクスケジューラ。タスクの名前は「リスターター」)。プログラムは5秒間一時停止して、タスクを作成する前にプログラムを強制終了する機会を与えます。

コマンドラインのタスクスケジューラインターフェイスを使用しますschtasks.exe。スクリプトの算術は、時間を有効に保ちながらHH:MM形式で時間オフセットを計算することです。

チャレンジ要件:

  • 終了すると、自動的に再起動します。 はい。タスクはプログラム終了の直前にスケジュールされます。

  • 同時に実行されるプログラムのインスタンスは1つだけです。 はい。プログラムは完全に終了し、約60秒間実行されません。スケジューラーによって開始されます。

  • サイクル中にユーザーが手動で開始したインスタンスは無視できます。 はい、一定のタスク名を使用する副作用として。

  • 再び開始することが保証されている限り。 はい、タスクスケジューラが実行され、schtasks.exeが存在する場合(両方とも既定のWindows構成に当てはまります)。

  • サイクルを停止する唯一の方法は、プロセスを強制終了することです。 はい、実行中の5秒間にプロセスを強制終了できます。プログラムは、5秒の遅延の前にタスクを削除します。この時点でタスクを強制終了しても、スケジューラーに浮遊タスクが残ることはありません。

  • ソリューションには、環境の再起動は含まれません はい。

注:コマンドラインインターフェイスが限られているため、再起動時間は分単位で指定する必要があり、ACアダプターが接続されていないラップトップではタスクは再起動しません(申し訳ありません)。


3

Unixシェル

再起動するために無関係なプログラムに依存する多くのソリューションはまだ見ていません。しかし、これはまさにat(1)ユーティリティが作成されたものです。

echo "/bin/sh $0"|at now + 1 minute

1分に1回しか実行されず、非常に速く終了するため、実際に実行中のプログラムをキャッチするのは困難です。幸いなことに、atq(1)ユーティリティはまだ進行中であることを示します。

$ atq
493     Fri Feb 21 18:08:00 2014 a breadbox
$ sleep 60
$ atq
494     Fri Feb 21 18:09:00 2014 a breadbox

そしてatrm(1)、あなたはサイクルを破ることができます:

$ atq
495     Fri Feb 21 18:10:00 2014 a breadbox
$ atrm 495
$ atq

あなたは置き換えることができ1 minute1 hour、または1 week。または、1461 days4年に1回実行されるプログラムを用意します。


2

パワーシェル

私は自分のルールを乱用しています(そしておそらく破ります)。

[System.Threading.Thread]::Sleep(-1)

それ自体を再起動するには無限の時間がかかります。
ホストプロセスを強制終了することで強制終了できます。

待って、見てください;)


5
創造性の場合は+1、不正行為の場合は-1。
ヨハネスH. 14

1
でも、止まらない場合は「再び始まることを保証しますか」?
ジェイソンC 14

だから私はおそらく規則を破っていると言った。それは無限の哲学的な美しさであり、その後は何でも起こり得ると仮定できます。チューリングマシンもそのように動作します。
ミクロ

1
-100は、特に技術的な面でのあなた自身のコンテストでの勝利をサポートしていません。
ジェイソンC 14

さて、あなたは知っています、そして while true; do sleep 1; done止めそうではありませんか?
よ」

2

バッシュ

echo -e "$(crontab -l)\n$(($(date "+%M")+1)) $(date '+%H %e %m * /repeat.sh')" | crontab -

これをrepeat.shとして/ディレクトリに保存し、実行権限を付与します。ファイルを削除することで殺すことができます

これは、crontabにエントリを配置して1分後に実行することで機能します。


2

Visual Base 6 :)

Sub Main:Shell "cmd ping 1.1.1.1 -n 1 -w 500>nul&&"""&App.Path &"\"&App.EXEName& """":End Sub

実行するには、新しいプロジェクトを作成し、このコードでモジュールを追加し、スタートアップオブジェクトを「Sub Main」に設定し、コンパイルしてから実行可能ファイルを実行します。


より読みやすいバージョン:

Sub Main()
    Call Shell("cmd ping 1.1.1.1 -n 1 -w 3000 > nul && """ & App.Path & "\" & App.EXEName & """")
End Sub

VB6は本物の男のVBです。その種の最後!
ジェイソンC 14


1

バッシュ

必要以上に長くなりますが、私は疲れており、気にしません:)

while true; do sleep 1; done; bash $0;

終了したら自動的に再起動する必要があると言っていましたが、繰り返しまたは無期限に再起動する必要があるとは特に言いませんでした。また、2つのインスタンスが同時に実行されることは決してないはずだと言っていましたが、実行されることはありません。;)

これを行うには、非常に多くの方法があります。私の個人的な好みは、どこか遠くにパケットを送信するようなことをし、そして(任意の数の方法で)応答がプロセスをトリガーすることです。


技術的には、sleepプロセスは終了時に再起動します
pastebin.comスラッシュ0mr8spkT 14

プログラムが自分自身を再起動するプログラムである場合、無期限に再起動する必要があることが暗示されます。
ジェイソンC 14

@Jason C:哲学的になりすぎることなく、可能な限り、再起動します。本当に自分で再起動することがどれほど複雑であるかを議論することはできますが、それは著者の意図をはるかに超えていると思います。ただし、実際に再起動する場合は、goto、JMP、または言語が提供する可能性のある構成を使用して最初に戻るので、それ自体が「再起動」します。それ以外の場合は、それ自体と明らかに似た何かを実行するだけです。しかし、その後、誰かが本当の意味で再起動しないという問題を起こす可能性があります。だから私は脱線します。
イアンウィザード14

1

Android: 1秒後にアラームがアクティビティを再起動します

public class AutoRestart extends Activity
{

@Override
public void onCreate()
{
    finish();
}

@Override
public void onDestroy() {

    Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
    restartServiceIntent.setPackage(getPackageName());

    PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmService.set(
            AlarmManager.ELAPSED_REALTIME,
            SystemClock.elapsedRealtime() + 1000,
            restartServicePendingIntent);

    super.onDestroy();
}

}

1

C + MPI環境

mpifork.c:

#include <stdio.h>

main(int argc, char * argv[])
{
    srand(time(NULL));
    int host = rand()%(argc-1)+1;
    FILE * logFile = fopen("mpifork.log", "a");
    if(logFile == NULL){
        fprintf(stderr, "Error: failed to open log file\n");
    } else {
        fprintf(logfile, "Jumping to %s\n", argv[host]);

        char * args[argc+5];
        args[0] = "mpirun";
        args[1] = "-H";
        args[2] = argv[host];
        args[3] = argv[0];
        for(host = 0; host < argc-1; host++) args[host+4] = argv[host+1];
        args[argc+3] = NULL;

        execvp("mpirun", args);
        fprintf(stderr, "exec died\n");
        perror("execvp");
    }
}

OpenMPIまたは他のMPI実装がインストールされている必要があります。コンパイルする

mpicc -o mpifork mpifork.c

今考えてみると、mpicc-gccまたはどんなコンパイラでも動作する理由はありません。mpirunが必要です。

gcc -o mpifork mpifork.c

実行するには、おそらくフルパス名とホストのリストを含める必要があります。たとえば、/ etc / hostsにすべてlocalhostを指すエントリを追加し、次のように実行しました。

/home/phil/mpifork localhost localhost1 localhost2 localhost3 localhost4

実行可能ファイルは、これを実行するマシン上の同じディレクトリになければなりません。


基本的に、これはコマンドラインで提供されるホストのリストを取得し、ホストの1つを選択し、同じ引数でターゲットホスト上で実行可能ファイルを起動します。すべてが正常に完了すると、mpirunはさまざまなマシン(または「localhost」のみを提供する場合は同じマシン)で何度も何度も自分自身を呼び出します。実行可能ファイル(mpifork)は終了しますexecvp

邪悪になりたければ、代わりにのコマンドラインで提供されるホストの完全なリストを含めることにより、すべてのマシンでこの起動を行うことができますargs。これにより、クラスターフォークボムのように、すべてのマシンで自身のコピーが何度も再生成されます。

ただし、この形式では、これがルールを満たしていると確信しています。


1

JavaScript

不要なときは「ネットワークに行く」ことなく:-) JavaScriptのイベントループスケジューリングにより、指定された要件を非常に簡単に満たすプログラムを作成できます。

(function program() {
    // do what needs to be done
    setTimeout(program, 100);
})();

これにより、program1秒あたり10回のペースで機能が「再起動」されます。JavaScriptの性質上、同時に実行されるタスクは1つだけであることが保証されており、「ページの再読み込み」のような「環境の再起動」は行われません。


0

x86アセンブリ

これが新しいプロセスを生成しないため、これが基準に適合するかどうかは完全にはわかりませんが、ここではとにかくです。

プログラムはメッセージボックスを表示し、メモリを割り当て、独自のコードセクションを割り当てられたメモリにコピーし、サイクルを開始するその場所にジャンプします。mallocが失敗するまで実行する必要があります。

format PE GUI 4.0
entry a

include 'include/win32a.inc'

section '.text' code readable executable

    a:
        push    0
        push    _caption
        push    _message
        push    0
        call    [MessageBoxA]

        push    b-a
        call    [malloc]

        push    b-a
        push    a
        push    eax
        call    [memcpy]

        call    eax
    b:

section '.data' data readable writeable

    _caption db 'Code challenge',0
    _message db 'Hello World!',0

section '.idata' import data readable writeable

    library user,'USER32.DLL',\
        msvcrt,'msvcrt.dll'

    import user,\
        MessageBoxA,'MessageBoxA'

    import msvcrt,\
        malloc,'malloc',\
        memcpy,'memcpy'

fasmでコンパイルされました。


4
新しくコピーされたコードを呼び出すことはプログラムの一部であるため、技術的にはプログラムはまったく終了しませんでした。
ミクロ

6
低レベルの観点からは、ここのすべてのプログラムで同じことが言えます。:-)
ブライアン・ノブラウチ

@BrianKnoblauch私は同意しません。ここで最も興味深い答えは、最初のプロセスが強制終了された後しばらくしてプロセスの新しいコピーが開始されるように、システム環境を変更しているようです。たとえば、将来的にプロセスを実行するchronジョブを作成することは、プロセスを完全に停止させてから再起動させる良い方法だと思います。
ケビン-モニカーを復活14

2
@BrianKnoblauchそうでもない。プロセスはオペレーティングシステムの構成要素です(最近では、1982年の286での保護モードの出現以来、仮想アドレス空間と保護メモリを介してハードウェアによって支えられています)。終了すると、その情報はすべてなくなります。チャレンジでは明示的に述べられていませんが、チャレンジの精神は、「再起動」は新しいプロセスIDが割り当てられることを意味することを意味します。
ジェイソンC 14

さて、途中でメモリを解放できた場合は、+ 1を返し@ます(管理した後は、pingを実行してください。私はおそらく目を離さないでしょう)。
yo

0

Linux upstart init

質問を最も厳密に読むと、これは不可能だと思います。本質的には、他の実行中のプログラムの助けを借りずにプログラムが自発的に開始することを要求しています。

atおよびchronベースの回答がいくつかありますが、最も厳密な読み方がatdあり、anacron常に実行されている補助プログラムであるため、失格となる場合があります。

関連するアプローチですが、少し低いレベルは、Linuxを使用することinitです。ルートとして、この.confファイルを追加します/etc/init/次の場所に。

説明「永遠に」

ランレベルで開始[2345]
ランレベルで停止[!2345]

復活する

exec sleep 10

次にinit、.confファイルを再読み取りします。

sudo telinit 5

これによりsleep、10秒間存続するプロセスが開始され、終了します。 initその後sleep、前のものがなくなったことを検出するとを再生成します。

もちろん、これはまだinit補助プログラムとして使用しています。これinitはカーネルの論理的な拡張であり、どのLinuxでも常に利用可能であると主張できます。

これが受け入れられない場合、次に行うべき下位レベルのことは、ユーザー空間プロセスを再生成するカーネルモジュールを作成することだと思います(それがどれほど簡単かはわかりません)。ここでは、カーネルはプロセスではないため、プログラムではない(補足)と主張できます。一方、カーネルは、CPUの観点から、それ自体がプログラムです。


-1

TI-BASIC:5文字

あれを呼べ prgmA

:prgmA

私は6文字を数えることができます。TI-BASICプログラムサイズのカウントについて特別なことはありますか?
pastebin.comスラッシュ0mr8spkT 14

:TI-basicでプログラミングしているときはいつでも、これは単なる行頭記号です。入力するものではなく、エディタ内にあります。
scrblnrd3 14

情報をご覧いただきありがとうございます
pastebin.comスラッシュ0mr8spkT 14

それは再帰呼び出しではありませんか?増分Aして、その値を基本ケースとして使用してみてください。最終的にはステップアウトします。
–ζ

まあ、すべての変数はti-basicのグローバルなので、よくわかりません。それはあるかもしれない
scrblnrd3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.