2

問題文 -

Perl を使用してユーザーにメッセージを表示し、入力を受け取ります。入力に基づいて、さらに処理を行う必要があるかどうかを判断します。この処理には長い時間がかかり (たとえば 5 時間)、ユーザーはリモートにログインしてこのプロセスを実行します。 Unix/Linux システム。したがって、ネットワークの誤動作がプロセスに影響を与えないようにする必要があります。プロセスをバックグラウンドに切り替えたい。

そのような実行中の Perl プロセスをバックグラウンドに切り替えるにはどうすればよいですか?

また

プロセスがバックグラウンドで実行されている場合、現在の端末からユーザー入力を取得することは可能ですか (ユーザーがプロセスを入力として実行する端末は、開始時に取得する必要があります)。

OS - Linux バリアント

4

3 に答える 3

4

うん、ユーザーとのやり取りが終わったら、プログラムをデーモン化する必要があります。ただし、モジュールを使用して作業を行うことをお勧めしますProc::Daemon。正しく行うには微妙な点がたくさんあります。POD forProc::Daemonはその使用法をよく説明していますが、単純な使用法は次のように基本的なものにすることができます

use Proc::Daemon;

# ... finished the interactive stuff
my $pid = Proc::Daemon::Init( { work_dir => '/var/run/my_program' })
exit 0 if ($pid == 0);
die "Error daemonizing, cannot continue: $!\n" if ($! != 0);
# ... now do the background processing
# note that STDOUT and STDERR are no longer connected to the user's terminal!
于 2013-10-04T17:47:39.383 に答える
2

上記の私のコメントの非常に単純な例を次に示します...

#!/usr/bin/perl
use strict;
use warnings;
my $lcnt = 0;
if( !$ARGV[0] ) {  # If no ARGS on the command line, get user input
    print "How many lines do you want to print?";
    chomp( $lcnt = <STDIN> );
    if( $lcnt > 0 ) {
        # when we are sure we have what we need
        # call myself.pl and put it in the background with '&'
        my $cmd = "./myself.pl ".$lcnt.' &';
        system($cmd);
        exit(0);
    } else { die "Invalid input!\n"; }
} else {  # Otherwise, lets do the processing
    $lcnt = $ARGV[0];
    for( my $x = 0; $x <= $lcnt; $x++ ) {
        my $cmd = "echo 'Printing line: $lcnt' >> /tmp/myself.txt";
        system($cmd);
        sleep(1);
    }
}
exit(0);

これを「myself.pl」というファイルに保存したら、それを実行します。コマンド ラインに引数がない場合、スクリプトは数値の入力を求めます。20 と入力し、Enter キーを押します。スクリプトがほぼ瞬時に終了するのがわかります。しかし、あなたがすぐに

tail -f /tmp/myself.txt

バックグラウンド プロセスがまだ実行中で、毎秒新しい行がファイルに出力されていることがわかります。また、Linux システムで「ps」コマンドを入力すると、生成されたプロセスがバックグラウンドで実行されていることが表示されます。

jlb@linux-f7r2:~/test> ps
 PID TTY          TIME CMD
 1243 pts/1    00:00:00 bash
 4171 pts/1    00:00:00 myself.pl
 4176 pts/1    00:00:00 ps
于 2013-10-04T21:04:52.590 に答える