• ベストアンサー

シェルやコマンドを一定時間で終了させる方法ってありますか。

こんばんは。 シェルやコマンドで例えば「ls」や「sleep」なんかは実行後には勝手に終わってくれますが、「top」等は止めるコマンドを入力しないかぎり終わりません。 このような特性を持っているコマンド、及びシェルを一定時間で終了するようにするには一体どうやればいいでしょうか。 シェルを作る際にどうしても自動で終わらないコマンドを入れたいのですが、それを入れるとその行以降のコマンドが実行されず、シェルが止まってしまって困っています。 環境はCentosです。どんな意見でもいいので教えて頂けたら幸いです。どうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

「シェル」とあるのはシェルスクリプトのことですね? 「スクリプト」を略すと意味が違ってしまうので。 Cで試しに書いてみました。第1引数に待つ時間(秒)、第2引数以降に実行するコマンドとその引数を書いてください。第1引数で指定した時間が経過すると、SIGTERMを送って子プロセスを終了させます。 簡単にテストはしましたが、無保証です。適当に改造して使ってください。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <signal.h> #include <errno.h> int main(int argc, char **argv) { int sec; pid_t pid; if (argc < 3) { fprintf(stderr, "too few arguments\n"); return 1; } sec = atoi(argv[1]); if (sec < 1) { fprintf(stderr, "wrong time %d\n", sec); return 1; } pid = fork(); if (pid == 0) { /* child process */ int i; char **args = (char **)malloc((argc-1)*sizeof(char*)); if (!args) { fprintf(stderr, "malloc() failed\n"); return 1; } for (i = 0; i < argc-2; i++) { args[i] = argv[i+2]; } args[argc-2] = NULL; execvp(argv[2], args); fprintf(stderr, "execvp() failed: errno=%d\n", errno); return 1; } /* parent process */ if (pid == -1) { fprintf(stderr, "fork() failed: errno=%d\n", errno); return 1; } else { sleep(sec); if (kill(pid, SIGTERM) < 0) { fprintf(stderr, "kill() failed: errno=%d\n", errno); return 1; } } return 0; }

arlstumia
質問者

お礼

エラー処理まで記述していただいて有難うございます。 参考にさせて頂きますね。

その他の回答 (1)

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.1

標準出力に結果を出していくタイプなら cmd | head 出力がうるさくなければ cmd & sleep 10 強制終了したければその後に kill `ps -u | grep cmd | awk '{print $2}'`

arlstumia
質問者

お礼

有難う御座います。参考にさせて頂きます。

関連するQ&A