Я пытаюсь запустить это -
watch "ps aux | grep myShittyProcess"
в сеансе tmux. Этот процесс myShittyProcess
также был запущен в сеансе tmux. ps aux
Работает без команды watch. Но как только я помещаю его в watch, он не выполняется. Как заставить это работать?
-- редактировать -
Обнаружено, что изменение размера tmux на весь экран заставляет его работать. Что-то связано с ps
обертыванием вывода и grep
невозможностью найти в обернутом контексте.
решение1
Как упоминалось в вопросе редактирования иответ 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
позволяет выполнять поиск как по аргументам командной строки, так и только по имени процесса.
решение2
Бегать
watch "COLUMNS= ps aux | grep TheProcessYouWatch"
Объяснение: watch
задает некоторые дополнительные переменные env, а именно COLUMNS
и LINES
. Это можно легко проверить, сравнив env | grep COLUMNS
и watch 'env | grep COLUMNS'
.
Если COLUMNS
установлено, ps
обрезает вывод до указанного количества символов в строке, даже если вывод передается по конвейеру grep
(или куда-либо еще). ( ps
, зачем вы так со мной поступаете?). Принудительного указания COLUMNS
пустого значения внутри watch
команды достаточно, чтобы заставить ps
работать так, как ожидал OP (и я).
Кстати, чтобы избежать включения процессов watch
и grep
в отслеживаемый вывод, рассмотрите возможность добавления []
следующего:
watch "COLUMNS= ps aux | grep [T]heProcessYouWatch"
(Конечно, я бы рекомендовал вам ознакомиться с pgrep
этим. Другие ответы будут вам полезны.)
решение3
ps
это утилита, которая производит вывод, понятный человеку, и полагаться на grepping текста, понятного человеку, плохая идея. Вы должны использовать pgrep myShittyProcess
вместо ps aux | grep myShittyProcess
. pgrep
производит голый список pid, и если вы хотите менее скучный вывод, вы можете передать pgrep
вывод в ps
:
ps -opid,user,args -p `pgrep myShittyProcess`
Чтобы использовать эту однострочную команду, watch
ее следует заключить в ' '
(not " "
), чтобы предотвратить раннюю подстановку команд оболочки:
watch 'ps -opid,user,args -p `pgrep myShittyProcess`'