Come eseguire il primo processo da un elenco dei processi memorizzati in un file ed eliminare la prima linea come se il file è stato una coda e ho chiamato “pop”?

StackOverflow https://stackoverflow.com/questions/366533

Domanda

Come eseguire il primo processo da un elenco di processi archiviati in un file e immediatamente eliminare la prima riga come se il file è stato una coda e ho chiamato "pop"?

mi piacerebbe chiamare il primo comando elencato in un semplice file di testo con \ n come separatore in un modo simile a comparsa:


Figura 1:

cmdqueue.lst :

proc_C1
proc_C2
proc_C3
.
.

Figura 2:

Pop il primo comando tramite popcmd :

proc_A | proc_B | popcmd cmdqueue.lst | proc_D

Figura 3:

cmdqueue.lst :

proc_C2
proc_C3
proc_C4
.
.
È stato utile?

Soluzione

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:]))

Esempio:

proc_A | proc_B | python pop-cmd.py cmdstack.lst | proc_D

Altri suggerimenti

Ooh, questo è un divertente one-liner.

Ok, ecco l'affare. Ciò che si vuole è un programma che, quando viene chiamato, stampa la prima riga del file allo stdout, quindi eliminare quella riga dal file. Suona come un lavoro per sed (1) .

Prova

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

Sono sicuro che qualcuno che aveva già avuto il loro caffè potrebbe cambiare il programma sed per ha bisogno del testa (1) chiamata, ma che funziona, e mette in mostra con una subshell ( "( foo)" viene eseguito in un sotto-processo.)

Suppongo che si sono costantemente aggiungendoli alla lima anche, in modo da riscrivere il file che si mette in pericolo di sovrascrivere i dati. Per questo tipo di compito penso che sarebbe meglio utilizzare i singoli file per ogni voce della coda, con data / ora per determinare l'ordine, e poi come si elabora ogni file è possibile aggiungere i dati in un file di registro e quindi eliminare il file trigger.

Davvero bisogno di ulteriori informazioni al fine di suggerire una buona soluzione. E 'importante sapere come il file è sempre aggiornato. Si tratta di un sacco di processi separati, un solo processo, ecc.

Credo che si avrebbe bisogno di riscrivere il file - per esempio eseguire un comando per elencare tutte le linee, ma il primo, scrivere che in un file temporaneo e rinominarlo con l'originale. Ciò potrebbe essere fatto utilizzando la coda o awk o perl a seconda dei comandi che avete a disposizione.

Se si vuole trattare un file come una pila, quindi un approccio migliore sarebbe quello di avere la parte superiore dello stack alla fine del file.

In questo modo si può facilmente tagliare il file all'inizio dell'ultima riga (= pop), e semplicemente aggiungere al file come si spinge.

È possibile utilizzare un piccolo script bash; il nome "popcmd":

#!/bin/bash
cmd=`head -n 1 $1`
tail -n +2 $1 > ~tmp~
mv -f ~tmp~ $1
$cmd

modifica: Uso sed per mezzo due linee, come Charlie Martin ha mostrato, è molto più elegante, naturalmente:

#!/bin/bash
cmd=`head -n 1 $1`
sed -i -e '1d' $1
$cmd

modifica: è possibile utilizzare questo esattamente come nel codice esempio di utilizzo:

proc_A | proc_B | popcmd cmdstack.lst | proc_D

Non è possibile scrivere l'inizio di un file, in modo da tagliare la linea 1 sarebbe un sacco di lavoro (riscrivere il resto del file (che in realtà non è che molto lavoro per il programmatore (è quello che tutti gli altri risposta post è scritto per voi :)))).

Mi consiglia di mantenere il tutto in memoria e con uno stack classico anziché un file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top