アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんは。

シェルやコマンドで例えば「ls」や「sleep」なんかは実行後には勝手に終わってくれますが、「top」等は止めるコマンドを入力しないかぎり終わりません。
このような特性を持っているコマンド、及びシェルを一定時間で終了するようにするには一体どうやればいいでしょうか。

シェルを作る際にどうしても自動で終わらないコマンドを入れたいのですが、それを入れるとその行以降のコマンドが実行されず、シェルが止まってしまって困っています。
環境はCentosです。どんな意見でもいいので教えて頂けたら幸いです。どうぞよろしくお願いします。

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/01 00:17

標準出力に結果を出していくタイプなら


cmd | head

出力がうるさくなければ
cmd &
sleep 10

強制終了したければその後に
kill `ps -u | grep cmd | awk '{print $2}'`
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/01 00:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!