2009-09-29 10 views
7

私はそれを殺すまで、Unixマシン上のバックグラウンドでwhileループ(while)を使ってPerlスクリプトを実行したいと思います。ログアウトしても、バックグラウンドでUNIXプログラムを実行し続けることはできますか?

これは私が管理者権限を持っていないリモートコンピュータです(何らかの理由でDaemon :: Generic :: While1を使用できません)。SSH経由でログインします。ログアウトした後も引き続き実行してください。私が見つけた

一つの方法は、bashのにこのような何かを書きです:

nohup ./my_script.pl & 

はそれを行うにはいくつかの他の、より好ましい方法はありますか?

crontabの編集は、そのコンピュータでは禁止されています(バックグラウンドで実行されているプロセスと長続きするプロセスは実行されません)。

答えて

17

私の好ましい方法、そして間違いなく最も簡単には、screenを使用している:

screen -d -m ./myProcess 
+1

ハ。私はすでにこの質問を忘れてしまった。スクリーンは今私の選択のツールです:) –

+0

私はこの救命ツールをちょうど最近発見しました。 'screen'はあなたがコマンドに戻り、タイプするものを許可します。これはSSHでも完璧に機能します。 – Kayla

1

これはあなたのperlスクリプトの中で動作するはずです。

$SIG{ HUP } = 'IGNORE'; 

nohupはmanページのドキュメントは言う。注:その後、SIGHUP 信号(3)( ``端末回線ハングアップ '') は無視されることを、設定しnohupは

をこれを行うには、任意の引数と共にユーティリティ を実行します。

0

シェルからバックグラウンドでジョブを実行することは、それが連続して実行されていることを確認するためにどのくらい手作業をしたいかによって異なります。

私はcrontabの@rebootを使用します(場合によっては定期的な検査も可能です)。しかし、プロセスが複数回起動される可能性があることを考慮する必要があります。最も単純な方法は、ロックファイルを持っていることです。ファイルがロックされている場合は終了し、終了する場合はタスクを続行します。ノンブロッキングチェックを使用することを忘れないでください。そうしないと、不必要なシステムリソースが不本意に処理される危険性があります。

画面も利用可能です。

crontab + screenを組み合わせることができます。

use POSIX 'setsid'; 

sub daemonize { 
    chdir '/'    or die "Can't chdir to /: $!"; 
    open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; 
    open STDOUT, '>/dev/null' 
          or die "Can't write to /dev/null: $!"; 
    defined(my $pid = fork) or die "Can't fork: $!"; 
    exit if $pid; 
    setsid     or die "Can't start a new session: $!"; 
    open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; 
} 

しかし、私はあなたがrootでないならがsetsidが動作するかどうかわからない:

+0

編集のcrontabはそのコンピュータ上禁止されています。 –

+0

プロセスが継続的に実行されていることを確認することはできません(つまり、再起動後)。 SIGHUPをnohup/trappingすることはまだ有効な方法です。 – tommym

+0

アドバイス、そのマシンにバックグラウンドプロセスを入れる前に管理者に相談してください。あなたがcrontabを許可されていない場合、管理者はあなたの周りを回ることを好まないかもしれません。あなたがきれいに尋ねるなら、おそらくあなたは許されるでしょう:) – tommym

1

スニペットはperldocはperlipcです。そうでない場合は、標準ハンドルを閉じた後にダブルフォークを試みてください。

いくつかのリンク:howtodaemonize

1
use Proc::Daemon; 
Proc::Daemon::Init; 

私はSendmailのフィルタプログラムと行くには、おそらく最も簡単な方法のために使用するものです。このモジュールはCPANを介して入手できます。

+0

もし彼がそれをインストールできないのでDaemon :: Generic :: While1を使うことができないなら、なぜProc :: Daemonはうまくいくのでしょうか?それはPerlのコアモジュールリストにありますか?もしそうでなければ、あまり役に立たないでしょう。 –

+0

私はそれをインストールすることができます(私はルートパスワードなしで動作するようにCPANを変更しました)が、/ var/runに書き込む能力について何か教えてくれます –

+0

うーん...ソースを見て、モジュール自体は試みていません/ var/runに書き込みます(少なくとも私が使っているバージョンでは)。それはかなり小さいモジュールなので、あなたはそれを見て、あなたが必要とする最小限のコードでより個人的なバージョンを作ることができます。 –

6

あなたがそうでなければ、あなたはまだトリックを行う必要があり、特定のTTY

./my_script.pl >/dev/null 2>&1 </dev/null & 

これにバインドされ、標準入力、標準エラー出力、標準出力をクローズする必要があります。

+0

完璧!画面がないときに必要なものを正確に – b1r3k

関連する問題