[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[osx-users:0371] Re: 終了時にシェル・コマンドを実行した



古暮でございます。

> というわけで(というわけでもないですが)、終了(TERM)シグナルを
> ひたすら待ちつづけて、受け取ったら指定したコマンド(ファイル)を
> 実行して終了するだけのプログラムを作ってみました。

面白い題材ですね。ちょっと機能追加を考えてみました。

On 2003.Mar.12, at 19:51 Asia/Tokyo, Yan wrote:
> 使い方は、termprocを適当な場所(e.g. /hogehage)に置いて、
> コマンドファイル(e.g. termcom)も適当な場所(e.g. /hegehoge)に
> 置いて、/etc/rcの最後のほうで
>
> /hogehage/termproc /hegehoge/termcom &
>
> とやっておくだけです。

親 process の影響を受けない様にする為に daemon 化しちゃった方が良いん
じゃないでしょうか? & で明示的に裏に送る必要もなくなりますし。

ついでに終了時に実行する command へ引数を渡せる様にしてみました。

/hogehage/termproc touch /tmp/bye

というふうに使えます。

# Source が読める事を履違える低劣な site 運用者もいる様ですが,
# 本当の利点はこういうところなんですけどねえ。



--- termproc.c.orig     Wed Mar 12 22:42:25 2003
+++ termproc.c  Sat Mar 15 00:06:02 2003
@@ -1,24 +1,24 @@
  #include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>

-static char fname[80];
+char **Argv;

  void termwait(sig)
  int sig;
  {
-       if (fname[0] != '\0')
-               system(fname);
+       if (Argv != NULL)
+                execvp(Argv[0], Argv);
         exit(0);
  }

  int main (int argc, const char *argv[])
  {
-       if (argc > 1) {
-               argv++;
-               strcpy(fname, *argv);
-       }
-       else {
-               fname[0] = '\0';
-       }
+       if (argc > 1)
+            Argv = (char **)++argv;
+       else
+            Argv = NULL;
+        daemon(0,0);
         signal(SIGTERM, termwait);
         pause();
  }


--[PR]------------------------------------------------------------------
         \\\ キャリアUPを目指すなら、AOL Career! ///
           ━━━━━━━━━━━━━━━━━━━━━━━━
■スキルアップ、転職、派遣等最新の求人情報であなたをサポート
今すぐGO=> http://ad.freeml.com/cgi-bin/ad.cgi?id=bGmkm
------------------------------------------------------------------[PR]--
<GMO GROUP> Global Media Online  www.gmo.jp