Часы с заменой процесса - PullRequest
0 голосов
/ 10 мая 2018

Я часто запускаю команду

squeue -u $USER | tee >(wc -l)

где squeue - это команда Slurm , чтобы узнать, сколько заданий вы выполняете. Это дает мне вывод из squeue и автоматически сообщает, сколько строк в нем.

Как мне watch эту команду?

watch -n.1 "squeue -u $USER | tee >(wc -l)" приводит к

Every 0.1s: squeue -u randoms | tee >(wc -l)                                                                                                                                                                                                                                                                                                        Wed May  9 14:46:36 2018

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `squeue -u randoms | tee >(wc -l)'

1 Ответ

0 голосов
/ 10 мая 2018

со страницы руководства watch:

Обратите внимание, что команда дается "sh -c", что означает, что вам может потребоваться использовать дополнительные кавычки, чтобы получить желаемый эффект.

sh -c также не поддерживает подстановку процессов, синтаксис, который вы используете здесь как >().


К счастью, этот синтаксис на самом деле не нужен для того, что вы делаете:

watch -n.1 'out=$(squeue -u "$USER"); echo "$out"; { echo "$out" | wc -l; }'

... или, если вы действительно хотите использовать свой исходный код даже при значительном снижении производительности (начиная не с одной, а двух новых оболочек каждую десятую секунды - - сначала sh, а затем bash):

bash_cmd() { squeue -u "$USER" | tee >(wc -l); } # create a function
export -f bash_cmd            # export function to the environment
watch -n.1 'bash -c bash_cmd' # call function from bash started from sh started by watch
...