目的 Pythonで24時間走らせ続けるデーモンを書いています。稼働状況の確認や設定を動的に変更をするためにREST APIを追加することにしました。メインルーチンに大きな変更を加えることなく、最小の手間で実装する方法を模索しました。 FlaskとFlask-API REST APIを提供するにはなんらかのウェブサーバが必要です。外部に公開するものではないのでFlaskが同梱している開発用のウェブサーバを使います。開発用ですがスレッドで同時アクセスにも対応していますので、十分実用に耐えます。 REST APIは手軽に実装できてテスト用のUIまで用意されているFlask-APIを使うことにしました。 以下の実験ではFlask-APIのサンプルを使います。コピペしてexample.pyというファイルで保存します。 http://www.flaskapi.org/#example マルチスレッド
logging myself - 要するにただの日記 - 物事をお金で解決する価値観を改めたいと考えるキッカケになった東日本大震災。 エネルギーを自分の手の内に取り戻したいと考えるようになった福島の原発事故。 それを契機に太陽光発電システムを自作し、無農薬無肥料菜園を借り、プチ自給自足を始めました。 東京都昭島市の賃貸アパート在住。嫁1人、娘2人、猫2匹の家族構成。 仕事はIT関係。 趣味はDIY、電子工作、Python、自家焙煎、家庭菜園、写真撮影。 Blog My Flickr Photos My Offgrid System Monitor Github RSS ちょっとしたコマンドラインツールを作るとき、欲しくなるのが以下のようなカッコイイオプション指定機能とヘルプ表示。 pythonなら、標準で使える argparseパッケージ を使って簡単に実装することができます。 こうして作
続き。今回はデーモンプロセスについて。 Unixプロセスとリソースの基礎を再確認した - えいのうにっき プロセスとの情報のやりとりについて再確認した - えいのうにっき プロセスの適切な扱い方を再確認した - えいのうにっき Unixプロセスとシグナルの基礎をRubyで再確認した - えいのうにっき パイプとソケットでのプロセス間通信を Ruby で再確認した - えいのうにっき デーモンプロセスについて知るときに前提知識として外せないのが、「プロセスグループ」と「セッショングループ」というふたつの概念らしい。まずはそれについて再確認する。 プロセスグループとセッショングループ プロセスグループ 今までずっとプロセス単体について見てきていたけど、実はプロセスというものは、全てがいずれかの「プロセスグループ」というものに属している。各プロセスグループには、ユニークな整数のIDが振られている
先日webrickのソースを少し読んだのですが、daemonを作る部分がよくわかりませんでした。 def Daemon.start exit!(0) if fork Process::setsid exit!(0) if fork Dir::chdir("/") File::umask(0) STDIN.reopen("/dev/null") STDOUT.reopen("/dev/null", "w") STDERR.reopen("/dev/null", "w") yield if block_given? end 具体的にわからない部分を書くと Process::setsidってなに? なんでfork二回もやってるの? その後のchdirとかumaskとかreopenとかは何でやってるんだろう? のようなところ。つまりほぼ全部ですね・・・>< そこでいつものように調べました。 Pro
一晩寝てからデーモンプロセスの作り方を眺めてとても簡単だということに気がついた.自分メモ. デーモンへの道のり fork()して子プロセス (次郎) を生成.親プロセス (太郎) を終了する 次郎プロセスでsetsid()する 次郎プロセスはセッショングループリーダになる この時点で次郎プロセスは制御端末を持たなくなる 次郎プロセスがfork()して孫プロセス (三郎) 生成.次郎プロセス終了 chdir("/")する. shutdown時のumount処理に迷惑をかけないため 標準入力,標準出力,標準エラー出力を閉じる サンプルコード 比較を行うために3つのプログラムを書いた. daemon 全部行う nondaemon 2度目のfork()をしない nondaemon2 setsid()しない #include <stdio.h> #include <stdlib.h> #includ
少し前にAdvent Calendarのネタでswiftfsと言うツールを作ったのですが、Goでデーモンプログラムをどう書けば良いのかよくわからなかった。以下の記事を参考にしたけど、そもそもfork()しちゃいかんとなると、なかなか難しいですね。 Goでデーモンを実装する で、swiftfsは以下のような実装にしました。syscall使うとWindowsとかで動かなくなってしまうとか、そもそも長いとか、あまり良い実装ではないように思います。Go的にもっとい良い方法があったら教えて下さい。コード全文は末尾とGistにあります。 親プロセス、子プロセス(デーモン本体)共通 func main() { var child *bool = flag.Bool("child", false, "Run as a child process") flag.Parse() // 子プロセスとのパイプを作
なるほどUnixプロセス ― Rubyで学ぶUnixの基礎を読みました。UNIXプロセスの話、特に実用的なforkの利用方法についての話がコンパクトにまとまっていてわかりやすかったです。あまり詳細に踏みこんでいるという感じではないけど、とっかかりにこの本にあるような知識があるのは良いと思いました。(シェルスクリプトから"foreman start"したときにCtrl-Cで終了できない現象の解説 - はこべブログ ♨ではまる前に読んでおいたら、もっとはやく問題解決できたと思います。) 第18章 デーモンプロセスに関係して二回目のforkについていろいろ調べたので、せっかくなのでメモを残しておきます。*1 第18章 デーモンプロセス では、プロセスをデーモン化するために必要な手順が丁寧に説明されています。その中で、プロセスを制御端末から切り離す手順として以下のようなコードが紹介されていました。
プログラマであれば一度は自分で作ってみたいデーモンプロセス. 本稿では,デーモンの作り方と関連するTipsを連載にて解説していきます. なお,本稿ではC言語を用いて説明します. デーモンプロセスの特徴 デーモンは通常のバックグラウンドプロセスとは異なり次の特徴を持っている. (通常は)親プロセスのプロセスID (PID) が 1 (init) 制御端末 (tty) を持たない デーモン化ユーティリティ・関数 簡単にプロセスをデーモン化する方法として,FreeBSDには daemon(8) というコマンドが用意されている. また,BSD系のOSには daemon(3) 関数が用意されており,簡単にプロセスのデーモン化を実現できる. しかし,これらのコマンドや関数の実装は非常にシンプルであり,またプロセス毎の用途・要望に対する拡張性や移植性を考えると各自で実装した方が便利であるため,本稿ではこ
プロセスと周辺の概念 TTY (仮想端末) |-セッション |-プロセスグループ |-プロセス 「TTY = セッション 1>N プロセスグループ 1>N プロセス」 プロセスの中の一つがセッションリーダーで、その中の複数がプロセスグループリーダー。 セッション TTYと結びついたログインセッションのこと。一つ以上のプロセスグループの集まりであり、セッションリーダーとなるプロセスが制御端末とやりとりをして端末切断時に子プロセスを全て終了させる役割を持つ。自身が属するセッション内でしかプロセスグループは生成できない。 プロセスグループ プロセスの集まりで、シグナルを他のプロセスへ送信することができる。メンバーはプロセスグループリーダーのプロセスIDをグループIDとして持つ。プロセスグループのリーダーになるにはsetpgid()かsetsid()を呼び出す。 fork() この関数を呼ぶとプロ
ほぼ、Getting a Python script to run in the background (as a service) on bootのまま。 pythonスクリプトの作成 たとえば、ここでは/usr/bin/local/test/test.pyをサービスで起動したと仮定する。 Deamon Spcriptの作成 ひな形 下記のスクリプトをmyservice.shとして/usr/local/bin/testに作成する。 #!/bin/sh ### BEGIN INIT INFO # Provides: myservice # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-D
JavaのサービスをApache commons daemonを使って起動する。 ようはOSの起動時にJavaのサービスを起動、そしてOSの停止時にJavaのサービスを停止したいということ。 ただし、OSはLinuxです。Windowsに関してはまだ調べていません・・・・ 昔は、sudo で対応していましたが、sudoで起動スクリプトを立ち上げるとsudoがなんかエラーを出力して、 設定を変えればいいらしいが、それも面倒なので何とかアプリの方で吸収できる方法をとるために、 Apache commons daemonにトライした。 (ちなみに、sudo のどんなエラーかは忘れてしまいました・・・) 必要なライブラリ Apache commons daemon download から、Javaのライブラリと Browse native binaries download area
Rubyでは、簡単にデーモンが記述できる。その方法は簡単!Ruby 1.9だと Process.daemon と書くだけだ。その行の後は制御端末が切離され、デーモンとして実行される。Ctrl+Cで終了できないので、永遠に実行を続けるスクリプトは「pkill -f」などで殺す。 既存のスクリプトをデーモン化するには、この一行を加えればいいだけなのだが、常にデーモンにしてしまうとデバッグが困難になってしまう。そこで、テスト時はふつうに実行して、普段はデーモンにしてしまえばいい。その方法もまた簡単!上の一行を daemonize.rb というファイルに保存すればいい。だけどこれだけだとつまらないので、ついでにRuby 1.8にも対応させてみる。 if Process.respond_to? :daemon # Ruby 1.9 Process.daemon else # Ruby 1.8 req
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く