2017-08-26 43 views
0

Je suis en train de saisir le numéro de processus de cette commandecapturant la sortie de grep et coupé à une variable dans tcsh

ps ax | grep catalina 

à une variable tcsh.

Jusqu'à présent, je suis en mesure de faire écho le numéro de processus à l'écran en utilisant ce script:

set pnum = `ps ax | grep catalina` 
echo $pnum | cut -d' ' -f1 

Mais lorsque je tente ce pour obtenir le résultat à la fois du grep et la cut

set pnum = `ps ax | grep catalina | cut -d' ' -f1` 

le résultat est une chaîne vide.

et cette séquence

set pnum = `ps ax | grep catalina` 
set pnum = `$pnum | cut -d' ' -f1` 

génère une erreur 1104: Command not found..

Qu'est-ce qui me manque?

Répondre

0

vous avez besoin de déconstruire votre processus encore plus loin (peut-être que vous avez). Pour comprendre votre problème d'abord voir ce que ps ax | grep catalina affiche, puis ajouter les choses set pnum =...

Oui, vous devriez être capable de l'enchaîner dans un pipeline, mais notez que si/quand il y a des espaces au début de la sortie, vous devez incrémenter votre -f1 pour chaque espace, donc un PID à 4 chiffres nécessitera plus de -f**n** qu'un PID à 6 chiffres.

Notez également que pour enlever la ligne grep qui apparaît, utilisez

| grep '[c]atalina' 

et, enfin, pensez à ce que votre message d'erreur 1104: Command not found. vous dit.

C'est l'identificateur de processus produit par $pnum que vous avez à l'avant de votre 2e ligne. Encore une fois, en prenant l'habitude de déconstruire le code défaillant, il est facile de voir où sont les problèmes. Vous pouvez également activer la trace de débogage du shell avec #!/bin/tcsh -vx comme ligne she-bang pour votre script.


Une solution peut-être mieux est d'utiliser

set pnum = `ps ax | awk '/[c]atalina/{sub(/^ */,"", $0);print $1}'` 

Mon csh/tcsh environnement est à agir vers le haut pour le moment, alors que légèrement testé.

IHTH.

+0

Merci pour les conseils. La sortie de mon grep est '1104 s002 S 6: 25.87/Bibliothèque/Java/J ...' Donc, si je le fais à la place: set pnum = 'ps ax | grep catalina | couper -d '' -f 2 | cut -d '' -f 1', pnum revient maintenant –

+0

Merci pour les conseils. sortie de ma grep est 1104 S002 S 6: 25,87 /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/bin/java -Djava.util.logging.config.file =/Utilisateurs/stephenschultz/apache-tomcat-7.0.55/conf/logging.properties -Djava.util.logging.manager = org.apache ... Donc, si je fais cela à la place de la commande dans mon message initial pnum = 'ps ax | grep catalina | couper -d '' -f 2 | cut -d » '-f 2 pnum revient avec D'où vient le 8895 supplémentaire de? –

+0

que se passe-t-il si vous obtenez un PID de seulement 3 places? ou 5 ou 6? En outre, vous créez une solution très "coûteuse", en ce sens que vous avez 3 processus pour "couper" la valeur dont vous avez besoin. La solution 'awk' que j'inclus gère n'importe quelle taille d'un PID et n'est qu'un processus. Mais content que vous ayez trouvé des trucs par vous-même. Bonne chance. – shellter

0

donner un essai à pgrep:

set npid = `pgrep -n nginx` 
echo $npid 

Le -n est d'obtenir le plus récent processus

(plus récemment commencé) Cela fonctionne également (la méthode que vous utilisez):

set pnum = `ps ax | grep nginx | cut -d ' ' -f1` 

Ce qui pourrait arriver, c'est que votre processus ne fonctionne pas ou qu'il y ait des espaces supplémentaires au début de la ligne, aussi probablement vous aurez e faire quelque chose comme ceci:

set pnum = `ps ax | grep nginx | grep -v grep | cut -d ' ' -f3` 

Ou utilisez awk:

set pnum = `ps ax | awk '/nginx/{print $1}'` 
+0

Cela a fonctionné: set pnum = 'ps ax | grep catalina | grep -v grep | coupe -d '' -f2'. Merci! –