3

ファイルに保存されているプロセスのリストから最初のプロセスを実行し、ファイルがキューであるかのように最初の行をすぐに削除し、「pop」と呼ぶにはどうすればよいですか?

単純なテキスト ファイルにリストされている最初のコマンドを、区切り文字として \n をポップな方法で呼び出したいと思います。

図1:

cmdqueue.lst :

proc_C1
proc_C2
proc_C3
.
.

図 2:

次の方法で最初のコマンドをポップしpopcmdます。

proc_A | proc_B | popcmd cmdqueue.lst | proc_D

図 3:

cmdqueue.lst :

proc_C2
proc_C3
proc_C4
.
.
4

7 に答える 7

4

pop-cmd.py:

#!/usr/bin/env python
import os, shlex, sys
from subprocess import call
filename = sys.argv[1]
lines = open(filename).readlines()
if lines:
    command = lines[0].rstrip()
    open(filename, "w").writelines(lines[1:])
    if command:
        sys.exit(call(shlex.split(command) + sys.argv[2:]))

例:

proc_A | proc_B | python pop-cmd.py cmdstack.lst | proc_D
于 2008-12-14T13:33:45.443 に答える
4

ああ、それは面白いワンライナーです。

よし、契約だ。必要なのは、呼び出されたときにファイルの最初の行を標準出力に出力し、その行をファイルから削除するプログラムです。sed(1)の仕事のように聞こえます。

試す

proc_A | proc_B | `(head -1 cmdstack.lst; sed -i -e '1d' cmdstack.lst)` | proc_D

すでにコーヒーを飲んでいる人なら、sed プログラムを変更してhead(1)呼び出しを不要にできると確信していますが、それは機能し、サブシェル ("( foo )" はサブプロセスで実行されます) の使用を示します。 )

于 2008-12-14T14:47:47.603 に答える
2

ファイルにも常に追加していると思いますので、ファイルを書き換えるとデータを上書きする危険があります。このタイプのタスクでは、キュー エントリごとに個別のファイルを使用し、日付/時刻を使用して順序を決定し、各ファイルを処理するときにデータをログ ファイルに追加してからトリガー ファイルを削除する方がよいと思います。

良い解決策を提案するには、より多くの情報が本当に必要です。ファイルがどのように更新されているかを知ることは重要です。別々のプロセスがたくさんあるのか、1 つのプロセスだけなのかなど。

于 2008-12-14T20:26:38.090 に答える
1

ファイルを書き直す必要があると思います-たとえば、コマンドを実行して最初の行以外のすべての行をリストし、それを一時ファイルに書き込んで元の名前に変更します。これは、使用可能なコマンドに応じて、tail または awk または perl を使用して実行できます。

于 2008-12-14T13:21:02.677 に答える
1

ちょっとした bash スクリプトを使用できます。「popcmd」という名前を付けます。

#!/ビン/バッシュ
cmd=`head -n 1 $1`
tail -n +2 $1 > ~tmp~
mv -f ~tmp~ $1
$cmd

編集:もちろん、チャーリー・マーティンが示したように、真ん中の 2 行に sed を使用すると、はるかにエレガントになります。

#!/ビン/バッシュ
cmd=`head -n 1 $1`
sed -i -e '1d' $1
$cmd

編集:これは、使用例のコードとまったく同じように使用できます。

proc_A | proc_B | popcmd cmdstack.lst | proc_D
于 2008-12-14T15:19:11.457 に答える
1

ファイルをスタックのように扱いたい場合は、ファイルの最後にスタックのトップを配置することをお勧めします。

したがって、最後の行の先頭でファイルを簡単に切り取ることができ (= pop)、プッシュするときにファイルに追加するだけです。

于 2008-12-14T13:42:09.763 に答える
0

ファイルの先頭に書き込むことはできないため、1 行目を切り取るのは大変な作業になります (ファイルの残りの部分を書き直します (これは実際にはプログラマーにとってそれほど多くの作業ではありません (他のすべての回答投稿にあるものです))。あなたのために書かれた:) ) ) )。

全体をメモリに保持し、ファイルではなく従来のスタックを使用することをお勧めします。

于 2008-12-14T14:54:22.347 に答える