Comment faire pour exécuter le premier processus à partir d'une liste des processus stockés dans un fichier et supprimez la première ligne comme si le fichier était une file d'attente et j'ai appelé « pop »?

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

Question

Comment faire pour exécuter le premier processus à partir d'une liste des processus stockés dans un fichier et supprimer immédiatement la première ligne comme si le fichier était une file d'attente et j'ai appelé « pop »?

Je voudrais appeler la première commande répertoriée dans un simple fichier texte avec \ n comme séparateur de façon semblable à la pop:


Figure 1:

cmdqueue.lst :

proc_C1
proc_C2
proc_C3
.
.

Figure 2:

Pop la première commande via popcmd :

proc_A | proc_B | popcmd cmdqueue.lst | proc_D

Figure 3:

cmdqueue.lst :

proc_C2
proc_C3
proc_C4
.
.
Était-ce utile?

La solution

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

Exemple:

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

Autres conseils

Ooh, qui est une seule ligne amusant.

D'accord, voici l'affaire. Ce que vous voulez est un programme qui, lorsqu'il est appelé, imprime la première ligne du fichier à stdout, puis supprimez cette ligne à partir du fichier. Sonne comme un emploi pour sed (1) .

Essayez

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

Je suis sûr que quelqu'un qui avait déjà eu leur café pourrait changer le programme sed pas besoin tête (1) appel, mais qui fonctionne, et montre à l'aide d'un sous-shell ( "( foo) » fonctionne dans un sous-processus.)

Je suppose que vous êtes constamment au Annexer des fichiers aussi, la réécriture de sorte que le fichier que vous met en danger l'écrasement des données. Pour ce type de tâche que je pense que vous seriez mieux à l'aide des fichiers individuels pour chaque entrée de file d'attente, par date / heure pour déterminer l'ordre, et que vous traitez chaque fichier que vous pouvez ajouter les données dans un fichier journal et puis supprimez le fichier déclencheur.

vraiment besoin plus d'informations afin de proposer une bonne solution. Il est important de savoir comment le fichier est mis à jour se. Est-il beaucoup de processus distincts, un seul processus, etc.

Je pense que vous auriez besoin de réécrire le fichier - par exemple exécuter une commande pour répertorier toutes les lignes, mais le premier, écrire que dans un fichier temporaire et renommez-le à l'original. Cela pourrait être fait en utilisant la queue awk ou perl en fonction des commandes dont vous disposez.

Si vous voulez traiter un fichier comme une pile, puis une meilleure approche serait d'avoir le haut de la pile à la fin du fichier.

Ainsi, vous pouvez facilement couper le fichier au début de la dernière ligne (= pop), et ajoutez simplement le fichier que vous appuyez sur.

Vous pouvez utiliser un petit script bash; nommez-le "popcmd":

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

modifier: avec sed pour les deux lignes du milieu, comme Charlie Martin a montré, est beaucoup plus élégant, bien sûr:

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

modifier: Vous pouvez utiliser exactement comme dans votre code d'utilisation exemple:

proc_A | proc_B | popcmd cmdstack.lst | proc_D

Vous ne pouvez pas écrire au début d'un fichier, de sorte couper la ligne 1 serait beaucoup de travail (réécrire le reste du fichier (ce qui est en fait que beaucoup de travail pour le programmeur (c'est ce que tous les autres poste de réponse a écrit pour vous :)))).

Je recommande de garder tout cela en mémoire et en utilisant une pile classique plutôt qu'un fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top