Exécuter
watch "COLUMNS= ps aux | grep TheProcessYouWatch"
Explication :watch
définit certaines variables d'environnement supplémentaires, à savoir COLUMNS
et LINES
. Cela peut être facilement vérifié en comparant env | grep COLUMNS
et watch 'env | grep COLUMNS'
.
Quand COLUMNS
est défini, ps
tronque sa sortie à autant de caractères dans une ligne, même si la sortie est redirigée vers grep
(ou autre chose). (ps
, pourquoi tu me fais ça?). Forcer COLUMNS
être vide entre watch
La commande de est suffisante pour faire ps
travailler comme OP (et moi) prévu.
Au fait, pour éviter watch
et grep
processus faisant partie de votre sortie surveillée, pensez à ajouter []
comme ceci :
watch "COLUMNS= ps aux | grep [T]heProcessYouWatch"
(Bien sûr, je vous recommande de vous familiariser avec pgrep
aussi. D'autres réponses seront utiles à cet égard.)
Comme mentionné dans la modification de la question et la réponse de xzfc, le problème semble être lié au retour à la ligne de tmux. Pour quelque chose de plus proche d'un remplacement immédiat de ps aux | grep [q]uote
, si vous n'avez pas besoin d'informations sur l'utilisateur, essayez :
$ pgrep -af [q]uote
392 bash -c sleep 5 && echo quote
399 bash -c sleep 5 && echo second quote
$ watch pgrep -af [q]uote
Le -a
flag fait que la sortie inclut les arguments de la ligne de commande, tandis que -f
vous permet de rechercher les arguments de la ligne de commande ainsi que le nom du processus uniquement.
ps
est un utilitaire qui produit une sortie lisible par l'homme, et s'appuyer sur le texte lisible par l'homme est une mauvaise idée. Vous devez utiliser pgrep myShittyProcess
au lieu de ps aux | grep myShittyProcess
. pgrep
produit une liste nue de pids, et si vous voulez une sortie moins ennuyeuse, vous pouvez passer pgrep
la sortie de ps
:
ps -opid,user,args -p `pgrep myShittyProcess`
Pour utiliser ce one-liner avec watch
vous devez l'inclure dans ' '
(pas " "
) pour empêcher la substitution précoce des commandes shell :
watch 'ps -opid,user,args -p `pgrep myShittyProcess`'