27 мар. 2013 г.

Еще одно удобство

Появилась свободная минутка, и я решил закончить давно начатый скрипт, который бы обрабатывал выходную информацию команды

qstat -n

и предоставлял ее в более сжатой форме. Например, многие меня спрашивали, можно ли сделать так, чтобы при проверке своей задачи можно было бы увидеть на каком узле задача считается, потому что команда nodes, про которую я писал ранее показывает общее состояние кластера, а писать qstat -n не очень удобно. Во-первых, это надо запомнить. Во-вторых, это надо нажимать на 3 клавиши больше. В-третьих, вывод этой команды громоздкий, не все пользователи могут адекватно его воспринимать. Заодно и получилось попрактиковаться и улучшить свое умение в написании однострочных скриптов.

Итак, скрипт выглядит следующим образом

#!/bin/sh
echo -e "\E[36;40m       ID          S   User      JobName          Node\E[0;0m"
echo -e "\E[36;40m=======================================================\E[0;0m"
qstat -n -1 | sed '1~0d' | sed '1~0d' | sed '1~0d' | sed '1~0d' | sed '1~0d' | awk '{print "\033[1;33m" $1 "\033[0m"," ", "\033[1;34m" $10 "\033[0m"," ", "\033[1;31m" $2 "\033[0m" ,"\t", "\033[1;32m" $4 "\033[0m","   ","\t", "\033[1;31m" $12 "\033[0m"}' | awk -F "/" '{print $1}'

Жирные строки выводят шапку. Видно, что на выходе будет информация по ID задачки, ее статусе в очереди, имени задачи, имени пользователя и узле на котором идет счет.
Красным показана исходная команда, которую скрипт будет модифицировать.
Синим идут команды, которые просто говорят, что первые 5 строк будут пропущены, а обработке подвержены все остальные. Немного топорная часть, потому что писать пять раз одну и ту же команду как-то глупо, но по-другому у меня не получилось :(
Зеленым показаны команды вывода нужного содержимого через awk.
Розовым опять же команда awk, которая причесывает предыдущий вывод.

Теперь последовательно, что у нас будет на выходе каждой составной части команды:
[alex@tisnum-head1 sys]$ qstat -n -1


tisnum-head1.cluster:
                                                                         Req'd  Req'd   Elap
Job ID               Username Queue    Jobname          SessID NDS   TSK Memory Time  S Time
-------------------- -------- -------- ---------------- ------ ----- --- ------ ----- - -----
4422.tisnum-head     alex     batch    D2_1000           27609     1  32    --  1000: R 28:34   node04/31+node04/30+node04/29+node04/28+node04/27+node04/26+node04/25+node04/24+node04/23+node04/22+node04/21+node04/20+node04/19+node04/18+node04/17+node04/16+node04/15+node04/14+node04/13+node04/12+node04/11+node04/10+node04/9+node04/8+node04/7+node04/6+node04/5+node04/4+node04/3+node04/2+node04/1+node04/0

Убираем ненужные 5 строк:

[alex@tisnum-head1 sys]$ qstat -n -1 | sed '1~0d' | sed '1~0d' | sed '1~0d' | sed '1~0d' | sed '1~0d'

4422.tisnum-head     alex     batch    D2_1000           27609     1  32    --  1000: R 28:35   node04/31+node04/30+node04/29+node04/28+node04/27+node04/26+node04/25+node04/24+node04/23+node04/22+node04/21+node04/20+node04/19+node04/18+node04/17+node04/16+node04/15+node04/14+node04/13+node04/12+node04/11+node04/10+node04/9+node04/8+node04/7+node04/6+node04/5+node04/4+node04/3+node04/2+node04/1+node04/0

Причесываем вывод с помощью awk:

[alex@tisnum-head1 sys]$ qstat -n -1 | sed '1~0d' | sed '1~0d' | sed '1~0d' | sed '1~0d' | sed '1~0d' | awk '{print "\033[1;33m" $1 "\033[0m"," ", "\033[1;34m" $10 "\033[0m"," ", "\033[1;31m" $2 "\033[0m" ,"\t", "\033[1;32m" $4 "\033[0m","   ","\t", "\033[1;31m" $12 "\033[0m"}'

4422.tisnum-head   R   alex      D2_1000         node04/31+node04/30+node04/29+node04/28+node04/27+node04/26+node04/25+node04/24+node04/23+node04/22+node04/21+node04/20+node04/19+node04/18+node04/17+node04/16+node04/15+node04/14+node04/13+node04/12+node04/11+node04/10+node04/9+node04/8+node04/7+node04/6+node04/5+node04/4+node04/3+node04/2+node04/1+node04/0


Окончательный вариант:

[alex@tisnum-head1 sys]$ qstat -n -1 | sed '1~0d' | sed '1~0d' | sed '1~0d' | sed '1~0d' | sed '1~0d' | awk '{print "\033[1;33m" $1 "\033[0m"," ", "\033[1;34m" $10 "\033[0m"," ", "\033[1;31m" $2 "\033[0m" ,"\t", "\033[1;32m" $4 "\033[0m","   ","\t", "\033[1;31m" $12 "\033[0m"}' | awk -F "/" '{print $1}'


4422.tisnum-head   R   alex      D2_1000         node04

Теперь, что будет показывать, когда мы запустим наш скрипт полностью:

[alex@tisnum-head1 sys]$ qst

              ID            S   User      JobName          Node
=====================================
4422.tisnum-head   R   alex      D2_1000         node04

Все очень красочно и информативно:)

Комментариев нет:

Отправить комментарий