7

Я пытаюсь запустить это - watch "ps aux | grep myShittyProcess" в сеансе tmux. Этот процесс myShittyProcess также был запущен в сеансе tmux. ps aux работает без команды watch. Но как только я помещаю это в часы, это не в состоянии выполнить. Как заставить это работать?

-- редактировать -

Обнаружил, что изменение размера tmux на весь экран заставляет его работать. Что-то связанное с переносом вывода ps и grep не находящимся в обернутом контексте.

3 ответа3

3

Бежать

watch "COLUMNS= ps aux | grep TheProcessYouWatch"

Объяснение: watch устанавливает определенные дополнительные переменные env, а именно COLUMNS и LINES . Это легко проверить, сравнив env | grep COLUMNS и watch 'env | grep COLUMNS' .

Когда установлено COLUMNS , ps усекает свой вывод до такого количества символов в строке, даже если вывод передается по конвейеру в grep (или что-то еще). (ps , почему ты делаешь это со мной?). Для того чтобы COLUMNS работал так, как ожидал OP (и I), достаточно, чтобы watch был пустым в команде ps .

Кстати, чтобы избежать процессов watch и grep являющихся частью вашего наблюдаемого вывода, рассмотрите возможность добавления [] следующим образом:

watch "COLUMNS= ps aux | grep [T]heProcessYouWatch"

(Конечно, я бы рекомендовал познакомиться с pgrep тоже. Другие ответы будут полезны с этим.)

2

ps - это утилита, которая производит читабельный вывод, и полагаться на усвоение читаемого человеком текста - плохая идея. Вы должны использовать pgrep myShittyProcess вместо ps aux | grep myShittyProcess . pgrep создает пустой список pids, и если вы хотите получить менее скучный вывод, вы можете передать вывод pgrep в ps:

ps -opid,user,args -p `pgrep myShittyProcess`

Чтобы использовать этот однострочный с watch вы должны заключить его в ' ' (не " "), чтобы предотвратить раннюю подстановку команд оболочки:

watch 'ps -opid,user,args -p `pgrep myShittyProcess`'
2

Как упоминалось в вопросе edit и ответе xzfc, проблема, похоже, связана с переносом строк в tmux. Для чего-то ближе к замене ps aux | grep [q]uote , если вам не нужна информация о пользователе, попробуйте:

$ pgrep -af [q]uote
392 bash -c sleep 5 && echo quote
399 bash -c sleep 5 && echo second quote

$ watch pgrep -af [q]uote

Флаг -a делает вывод включающим аргументы командной строки, в то время как -f позволяет вам искать как аргументы командной строки, так и только имя процесса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .