J'ai un serveur CI avec une interface de ligne de commande qui me permet de lancer un travail à distance ( jenkins
serveur CI et l' jenkins-cli.jar
outil).
Après avoir lancé le travail, je tail -f
le journal (désolé pour la commande en désordre):
ssh -t my-jenkins-host.com "tail -f \"/var/lib/jenkins/jobs/$job_name/builds/\`ls -ltr /var/lib/jenkins/jobs/$job_name/builds/ | grep '^l' | tail -n 1|awk '{print \$9}'\`/log\""
Une fois le travail terminé, généralement après au moins 5 minutes, j'obtiens la ligne suivante sur la sortie:
Finished: SUCCESS
Existe-t-il un bon moyen d'arrêter de suivre le journal à ce stade? c'est à dire qu'il y a comme une tail_until 'some line' my-file.log
commande?
BONUS: crédit supplémentaire si vous pouvez fournir une réponse qui renvoie 0 lorsque SUCCESS est apparié, 1 lorsque FAILURE est apparié et que votre solution fonctionne sur mac! (qui je crois est basé sur bsd)
q
commande prend un code de sortie facultatif. Donc lased
commande seraitsed '/^Finished: SUCCESS$/ q0; /^Finished: FAILURE$/ q1'
Finished: SUCCESS
c'est la dernière ligne de sortie-q
, ce qui signifie calme, quitte dès qu'il trouve une correspondance-x
faitgrep
correspondre la ligne entièrePour la deuxième partie, essayez
-m <number>
demande à grep de s'arrêter après la correspondance des numéroset l'
grep -q
état de sortie ne sera que0
s'ilSUCCESS
est trouvé à la fin de la ligneSi vous voulez voir toute la sortie, vous ne pouvez pas l'utiliser
grep -q
, mais vous pouvez toujours le fairequi fait tout sauf mettre l'état de sortie à 1 si
FAILURE
apparaît.la source
grep
dans ma réponse à l'origine, mais s'il utilise,tail -f
il veut probablement voir la sortie du fichier;grep
ne va pas montrer toutes les lignes intermédiairesUne variation sur la réponse de @ Mikel avec les commentaires de @ Mrozek (j'aurais répondu sur le commentaire mais je pense que je n'ai pas encore assez de privilèges)
vous permettrait d'utiliser la solution de @ Mikel et de voir la sortie à l'écran
la source
Je n'ai aimé aucune des réponses ici, alors j'ai décidé de lancer la mienne. Ce script bash répond à tous les critères et inclut le BONUS pour la sortie de 1 en cas d'échec.
Une fonction timeout est également incluse, ce qui entraînera un code de sortie de 3. Si vous n'avez pas la commande timeout sur votre système, récupérez le script timeout.sh d'Anthony Thyssen:
http://www.ict.griffith.edu.au/anthony/software/timeout.sh
D'après les commentaires ci-dessous, j'ai mis à jour l'impression du journal pour arrêter l'expansion des caractères d'échappement et inclus toutes les fonctionnalités d'une lecture standard. Voir /programming//a/10929511 pour les détails complets de «lecture». Le contrôle EOF n'est pas requis ici, mais est inclus pour être complet.
la source
while IFS= read -r LOGLINE
pour empêcher le shell d'effectuer un fractionnement des espaces sur les lignestail
.read
ne se divise pas lorsqu'il n'y a qu'une seule variable (et ce n'est pas un tableau avec-a
), mais vous en avez besoin-r
si les données d'entrée contiennent une barre oblique inverse. Mais si les données d'entrée contiennent une barre oblique inverse, ellesecho "$var"
peuvent également bousiller en fonction de votre shell et / ou de votre système, donc mieuxprintf '%s\n' "$line"
voici un script python qui fait presque ce que je veux (voir les mises en garde ci-dessous):
mises en garde:
les lignes ne sont pas imprimées à mesure qu'elles entrent ... elles sont imprimées en groupes ... semble être un tampon en cours
je devrais l'installer en tant que script sur mon chemin ou quelque chose, donc ce n'est pas pratique, et je préférerais une ligne lisse :)
la source
tail
semble faire la même mise en mémoire tampon, donc je suppose que ce n'est pas quelque chose qui mérite d'être essayé.J'ai eu des problèmes avec
sed
etgrep
et leurs options, alors j'écris les miennesone with bash conditions
la source
Vous essayez aussi
la source