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`'