どのようにファイルに保存されているプロセスのリストから、最初のプロセスを実行すると、ファイルがキューであるかのように最初の行を削除し、私は「ポップ」と呼ばれるには?
質問
ファイルに保存されているプロセスのリストから、最初のプロセスを実行すると、ファイルがキューだったと私は「ポップ」?
と呼ばれているかのように、すぐに最初の行を削除する方法私はポップ状に区切り文字としての\ 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
.
.
解決
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
他のヒント
ああ、それは面白いワンライナーです。
さて、ここでの契約です。何が欲しいのは、呼び出されたときに、そのファイルからその行を削除し、標準出力にファイルの最初の行を表示するプログラムです。 のsedのための仕事のような音(1)の
試してみてください。
proc_A | proc_B | `(head -1 cmdstack.lst; sed -i -e '1d' cmdstack.lst)` | proc_D
私は(「(すでに持っていた誰かが彼らのコーヒーがのヘッド(1)の呼び出しを必要としないためのsedのプログラムを変更することができましたが、それが動作し、サブシェルを使用してオフに示していることを確信していますFOO)」サブプロセスで実行されます。)
私は、あなたは常にので、データを上書きする危険を置きますファイルを書き換え、またファイルに追加されていることを前提としています。タスクのこのタイプのために私はあなたが順序を決定するために、日付/時刻を使用して、各キュー・エントリのために個々のファイルを使用して良いだろう、とあなたは各ファイルを処理するよう、あなたはログファイルにデータを追加して、トリガー・ファイルを削除できると思います。
本当に良い解決策を提案するために、より多くの情報が必要。これは、ファイルが更新取得する方法を知っておくことが重要です。それは独立したプロセスの多くは、ただ一つのプロセス、などである。
私は、あなたがファイルを書き換える必要があると思います - 例えば、すべての行が、最初の一覧を表示するコマンドを実行して一時ファイルにそれを書き込み、元に名前を変更します。それはあなたが利用可能なコマンドに応じて、尾やawkのか、Perlを使用して行うことができます。
このように、簡単に最後の行(=ポップ)の冒頭でファイルを遮断することができ、あなたが押すと、単にファイルに追加します。
あなたは少しbashスクリプトを使用することができます。
: "popcmd" という名前を付けます#!/bin/bash cmd=`head -n 1 $1` tail -n +2 $1 > ~tmp~ mv -f ~tmp~ $1 $cmd
の編集:のチャーリー・マーティンが示したように、中央の2つのラインのためのsedの使用はもちろん、はるかに洗練されます:
#!/bin/bash cmd=`head -n 1 $1` sed -i -e '1d' $1 $cmd
の編集:のあなたは正確にあなたの例の使用コードのようにこれを使用することができます:
proc_A | proc_B | popcmd cmdstack.lst | proc_D
あなたはそう(それは他の何ごとだ(実際にはプログラマのためのその多くの仕事されていない(ファイルの残りの部分を書き換えるライン1は、多くの仕事だろう切り出し、ファイルの先頭に書き込むことはできません回答ポストは:)あなたのために書かれた)))。
私はメモリに全部を維持し、古典的なスタックではなくファイルを使用してお勧めします。