私はkonsole
正しく使用していますか?
おそらく、いいえ。しかし、それは状況によります。この質問は、次の 2 つの問題に分解できます。
- 外部コマンドの実行中にプログラムが停止しないように、同時実行を実現するにはどうすればよいですか
- の使い方
konsole
。
1. 並行性
それには複数の方法があります。fork||exec('new-program')
、 からsystem 'new-program &'
、または で始まりopen
ます。
system
OS の標準シェルを起動し、指定したコマンドを実行します。複数の引数を指定すると、シェルのエスケープは行われず、指定されたプログラムがexec
直接実行されます。(exec
関数はこれまでと同じインターフェースを持っています)。system
コマンドが正しく実行されたかどうかを示す数値を返します。
system("my-command", "arg1") == 0
or die "failed my-command: $?";
この戻り値が何を意味するかについての完全な情報については、を参照してくださいperlfunc -f system
…</p>
成功したexec
場合は戻りませんが、プロセスを新しいプログラムの実行に変換します。
fork
プロセスを 2 つに分割し、子プロセスとプロセスを同等のコピーとして実行します。の戻り値のみが異なりますfork
。親は子の PID を取得します。子供はゼロになります。したがって、以下はコマンドを非同期的に実行し、メイン スクリプトをさらに遅延なく実行させます。
my @command = ("mpg321", "song.mp3");
fork or do {
# here we are in the child
local $SIG{CHLD} = 'IGNORE'; # don't pester us with zombies
# set up environment, especially: silence the child. Skip if program is well-behaved.
open STDIN, "<", "/dev/null" or die "Can't redirect STDIN";
open STDOUT, ">", "/dev/null" or die "Can't redirect STDOUT";
exec {$command[0]} @command;
# won't ever be executed on success
die qq[Couldn't execute "@command"];
};
上記のプロセスは、子を効果的にデーモン化します (tty なしで実行されます)。
2.コンソール
そのプログラムのコマンド ライン インターフェイスはひどいもので、パラメータを指定して実行すると半分の確率でエラーが発生します。
ただし、コマンド (および作業ディレクトリ) は実際には機能するはずです。konsole
コマンドはすぐに戻るため、末尾のアンパサンドは必要ありません。何かのようなもの
# because I `say` hello, I can be certain that this actually does something.
konsole --workdir ~/wherever/ --new-tab -e perl -E 'say "hello"; <>'
私にとってはうまくいきます(新しいタブを開き、「こんにちは」と表示し、Enterキーを押すと閉じます)。そこの最後のreadlineは、タブを閉じるまでタブを開いたままにします。-e
経由でコマンドを実行するまで、タブを開いたままにしておくことができます--hold
。これにより、他の方法では消えてしまうエラー メッセージを確認できます。