2009-04-19 7 views
55

LinuxでデーモンとしてPerlスクリプトを実行する簡単な方法はありますか?LinuxでシステムデーモンとしてPerlスクリプトを実行するにはどうすればよいですか?

現在、これはCentOS上です。システムで起動してシステムをシャットダウンしたいので、/etc/rc.d/init.dインテグレーションも便利ですが、いつもカスタムラインを/etc/rc.d/rc.localに追加できます。

答えて

81

最も簡単な方法はProc::Daemonです。

  1. フォークの子供をし、親プロセスを終了します。

    #!/usr/bin/perl 
    
    use strict; 
    use warnings; 
    use Proc::Daemon; 
    
    Proc::Daemon::Init; 
    
    my $continue = 1; 
    $SIG{TERM} = sub { $continue = 0 }; 
    
    while ($continue) { 
        #do stuff 
    } 
    

    代わりに、あなたはPROC ::デーモンが行うすべてのものを行うことができます。

  2. セッションリーダー(プログラムを制御端末から切り離す)になります。
  3. 別の子プロセスをフォークし、最初の子を終了します。これにより、制御端末を獲得する可能性がなくなります。
  4. 現在の作業ディレクトリを"/"に変更します。
  5. ファイル作成マスクをクリアします。
  6. 開いているファイルディスクリプタをすべて閉じます。

ランレベルシステムとの統合は簡単です。次のようなスクリプトが必要です(XXXXXXXXXXXXをPerlスクリプトの名前で置き換えてください)。YYYYYYYYYYYYYYYYYYYは、それが何であるかの説明を持ち、/path/toはPerlスクリプトのパスです。/etc/init.dです。 CentOSを使用しているので、一度スクリプトを/etc/init.dにすると、chkconfigを使って様々なランレベルでそのスクリプトを有効または無効にすることができます。

#!/bin/bash 
# 
# XXXXXXXXXXXX This starts and stops XXXXXXXXXXXX 
# 
# chkconfig: 2345 12 88 
# description: XXXXXXXXXXXX is YYYYYYYYYYYYYYYYYYY 
# processname: XXXXXXXXXXXX 
# pidfile: /var/run/XXXXXXXXXXXX.pid 
### BEGIN INIT INFO 
# Provides: $XXXXXXXXXXXX 
### END INIT INFO 

# Source function library. 
. /etc/init.d/functions 

binary="/path/to/XXXXXXXXXXXX" 

[ -x $binary ] || exit 0 

RETVAL=0 

start() { 
    echo -n "Starting XXXXXXXXXXXX: " 
    daemon $binary 
    RETVAL=$? 
    PID=$! 
    echo 
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/XXXXXXXXXXXX 

    echo $PID > /var/run/XXXXXXXXXXXX.pid 
} 

stop() { 
    echo -n "Shutting down XXXXXXXXXXXX: " 
    killproc XXXXXXXXXXXX 
    RETVAL=$? 
    echo 
    if [ $RETVAL -eq 0 ]; then 
     rm -f /var/lock/subsys/XXXXXXXXXXXX 
     rm -f /var/run/XXXXXXXXXXXX.pid 
    fi 
} 

restart() { 
    echo -n "Restarting XXXXXXXXXXXX: " 
    stop 
    sleep 2 
    start 
} 

case "$1" in 
    start) 
     start 
    ;; 
    stop) 
     stop 
    ;; 
    status) 
     status XXXXXXXXXXXX 
    ;; 
    restart) 
     restart 
    ;; 
    *) 
     echo "Usage: $0 {start|stop|status|restart}" 
    ;; 
esac 

exit 0 
+0

私はchkconfigをサポートしていません。 chkconfigを実行するときに-add X.任意の提案を追加しますか? – Jirapong

+0

ああ、申し訳ありませんが私の間違いであることが判明。 #記述に打ち込んでください。どうもありがとう! – Jirapong

+0

偉大なフィードバック、大きな感謝! –

7

最も簡単な方法はdaemonです。プロセスをデーモンとして実行することができます。つまり、たとえばPythonに変更することを決めた場合、ライブラリについて心配する必要はありません。

daemon myscript args 

これはほとんどのディストリビューションで使用できますが、デフォルトではインストールされていない可能性があります。

+0

これは素晴らしいアイデアですが、一部の実稼働環境ではデーモンバイナリにアクセスできないことがわかります。個人的には、エンタープライズのプロダクション環境で使用するものよりも、テスト/開発のプラットフォームが多く見られます。良い情報だ - 私は以前聞いたことがない。 (編集:スレッドが5歳であったことを認識していませんでしたが、それでもなおIMOです) –

36

Chasが提案したProc::Daemonがない場合は、オーウェンズ、あなたが手で行う方法は次のとおりです。

sub daemonize { 
    use POSIX; 
    POSIX::setsid or die "setsid: $!"; 
    my $pid = fork() // die $!; #// 
    exit(0) if $pid; 

    chdir "/"; 
    umask 0; 
    for (0 .. (POSIX::sysconf (&POSIX::_SC_OPEN_MAX) || 1024)) 
     { POSIX::close $_ } 
    open (STDIN, "</dev/null"); 
    open (STDOUT, ">/dev/null"); 
    open (STDERR, ">&STDOUT"); 
} 
+1

Proc :: Daemonをインストールするのは手作業で行うよりはるかに簡単ですが、TMTOWTDIは常にそうです。 ) –

+0

実際、私は以前のものよりも良く働いていました。私はすべての入力出力を制御できます。あなたはProc :: Daemonでもそれを見つけることができると思います! –

+7

非コアモジュールを必要としないためにアップしました。 –

関連する問題