Jobb taszkkezelõ

bAndie91 küldte be v, 2012-01-01 04:05 időpontban

code {background-color:black;color:limegreen;font-weight:bold}
.block {display:block}

Hadd kedveskedjek a Linuxbox olvasóinak egy kis konzolos segédprogrammal!

A parancsterminál felületét alapjában véve egyetlen alkalmazás foglalja el, a shell. Azonban sok megoldás létezik még a grafikus ablakkezelõ elõtt is, amivel a konzolból munkaasztalt varázsolhatunk. Ilyen pl. a GNU screen, vagy a tmux terminál többszörözõ; válthatunk másik vty-re; vagy kicsit hasonlóak a háttérshellt használó programok, ahol a célprogramban végezzük gyakori mũveleteket (pl fájlkezelés mc-vel), minden másra pedig ott a shell.
A legtöbb shellnek van viszont beépített job kezelõje és különben is szeretem a már meglévõ megoldásokat használni! bash-ben így fest a feladatkezelõ:

  • indíthatom a parancsokat a háttérben
    [geshifilter-code]$ find / -iname afajlaminemtudomholislehet &[/geshifilter-code]
  • futó programot pillanatmegállíthatok, hogy visszakapjam a promptot
    [geshifilter-code]Ctrl-Z[/geshifilter-code]
  • majd a háttérben továbbfuttatom
    [geshifilter-code]$ bg %1[/geshifilter-code]
  • Milyen taszkjaim is vannak?
    [geshifilter-code]$ jobs[/geshifilter-code]
  • újra elõveszem az elõtérbe
    [geshifilter-code]$ fg %1[/geshifilter-code]

Ezzel a pár rövidke builtin paranccsal kezelem a bash beépített feladatkezelõjét. Habár igen rövidek, sõt még így is rövidíteni lehet ([geshifilter-code]fg %+[/geshifilter-code] = [geshifilter-code]fg[/geshifilter-code] = [geshifilter-code]%+[/geshifilter-code], [geshifilter-code]bg %1[/geshifilter-code] = [geshifilter-code]%1&[/geshifilter-code]), jól jönne hozzá egy jobb job kezelõ!

Erre írtam a jobsel «job select» szkriptet.

  1. Kezdetben csak egy promptban megjelenõ szám volt, ami a háttérben futó job-ok számáról tájékoztatott.
    [geshifilter-code class=block]PS1='\[\033[${PS1COLOR_USER}m\]\u\[\033[${PS1COLOR_AT}m\]@\[\033[${PS1COLOR_HOST}m\]\h$(ERRORLEVEL=$?; test \j -eq 0 || echo -n "\[\033[${PS1COLOR_DELIM1}m\]:\[\033[${PS1COLOR_JOBS}m\]\j"; test $ERRORLEVEL -eq 0 || echo -n "\[\033[${PS1COLOR_DELIM1}m\]:\[\033[${PS1COLOR_EXITCODE}m\]$ERRORLEVEL")\[\033[${PS1COLOR_DELIM1}m\]:\[\033[${PS1COLOR_WD}m\]\w\[\033[${PS1COLOR_DELIM2}m\]\$\[\033[00m\] '[/geshifilter-code]
  2. Majd kibõvítettem a PROMPT_COMMAND-omat, ahogyan kecsi javasolta:
    [geshifilter-code]PROMPT_COMMAND="$PROMPT_COMMAND${PROMPT_COMMAND:+; }"'jobs -l | _jobs_on_prompt'[/geshifilter-code]
    Ahol a _jobs_on_prompt ez a perl egysoros:
    [geshifilter-code class=block]<font color="#ffff00"><b>while</b></font>(&lt;&gt;){ (<font color="#00ffff"><b>$j</b></font>,<font color="#00ffff"><b>$p</b></font>)=<font color="#ffff00"><b>/</b></font><font color="#ff6060"><b>(</b></font><font color="#ff6060"><b>\d</b></font><font color="#ff6060"><b>+)</b></font><font color="#ff6060"><b>\]\S</b></font><font color="#ff6060"><b>?</b></font><font color="#ff6060"><b>\s</b></font><font color="#ff6060"><b>+(</b></font><font color="#ff6060"><b>\d</b></font><font color="#ff6060"><b>+)</b></font><font color="#ffff00"><b>/</b></font>; <font color="#ffff00"><b>open</b></font>(<font color="#00ffff"><b>P</b></font>,<font color="#ff40ff"><b>&quot;</b></font><font color="#ff40ff"><b>/proc/</b></font><font color="#00ffff"><b>$p</b></font><font color="#ff40ff"><b>/stat</b></font><font color="#ff40ff"><b>&quot;</b></font>) <font color="#ffff00"><b>and</b></font>&nbsp;(<font color="#00ffff"><b>$c</b></font>,<font color="#00ffff"><b>$s</b></font>)=(<font color="#00ffff"><b>&lt;P&gt;</b></font>=~<font color="#ffff00"><b>/</b></font><font color="#ff6060"><b>\s\(</b></font><font color="#ff6060"><b>(.+?)</b></font><font color="#ff6060"><b>\)\s</b></font><font color="#ff6060"><b>+(</b></font><font color="#ff6060"><b>\S</b></font><font color="#ff6060"><b>+)</b></font><font color="#ffff00"><b>/</b></font>) <font color="#ffff00"><b>and</b></font>&nbsp;<font color="#00ffff"><b>$o</b></font>.=<font color="#ff40ff"><b>&quot;</b></font><font color="#ff40ff"><b>[geshifilter-questionmarkphp]&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#00ffff&quot;&gt;&lt;b&gt;$j&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#00ffff&quot;&gt;&lt;b&gt;$c&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;(&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#00ffff&quot;&gt;&lt;b&gt;$p&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;) &lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#00ffff&quot;&gt;&lt;b&gt;$s&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;] &lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;&amp;quot;&lt;/b&gt;&lt;/font&gt;} &lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;&amp;quot;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff6060&quot;&gt;&lt;b&gt;\033&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;[s&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff6060&quot;&gt;&lt;b&gt;\033&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;[1;0H&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff6060&quot;&gt;&lt;b&gt;\033&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;[&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#00ffff&quot;&gt;&lt;b&gt;$ENV&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#00ffff&quot;&gt;&lt;b&gt;{&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;PS1COLOR_JOBS&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#00ffff&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;mjobs: &lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#00ffff&quot;&gt;&lt;b&gt;$o&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff6060&quot;&gt;&lt;b&gt;\033&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;[m&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff6060&quot;&gt;&lt;b&gt;\033&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;[u&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ff40ff&quot;&gt;&lt;b&gt;&amp;quot;&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#00ffff&quot;&gt;&lt;b&gt;$.&lt;/b&gt;&lt;/font&gt;[/geshifilter-code]
    A legfelsõ konzolsorba sorolja fel a job-okat.</li>
    <li>Most pedig ott áll a dolog, hogy ha már ilyen szép tálcagomb-szerũen csücsülnek fenn a futó programok, tegyük interaktívvá és lehessen õket kiválasztani!
    Ehhez már egy egysorosnál hosszabb kódot tudtam gyártani (bár CRLF nélkül is meg lehetne írni ;)
    A cikk csatolmányaként tudjátok letölteni!
    Kis HaszUtMelléMaFor:
    Ha lementetted valahova a $PATH-ba jobsel néven futtathatósági joggal,
    <ul>
    <li>érdemes rá <b>alias</b>t deklarálni:
    [geshifilter-code]alias j=&#039;eval $(jobsel &quot;$(jobs -l)&quot; $COLUMNS)&#039;[/geshifilter-code], </li>
    <li>vagy <b>keybinding</b>et mondjuk a Meta-j billentyũkombinációhoz:
    [geshifilter-code]bind -x &#039;&quot;\204&quot;&#039;:&quot;eval \$(jobsel \&quot;\$(jobs -l)\&quot; \$COLUMNS)&quot;&#10;bind &#039;&quot;\ej&quot;&#039;:&quot;\&quot;\204\&quot;&quot;[/geshifilter-code]</li>
    </ul>
    Innen már boldogulsz, jobbra-balra kiválaszt, enter "megnyit", kérdõjel súgó.
    </ol>

    Köszönöm, jó hekkelést![/geshifilter-questionmarkphp]

jobsel.txt3.24 KB
taslis.txt2.87 KB

kecsi küldte be sze, 2012-01-04 22:03 időpontban

Permalink

Először is köszi szépen az újévi posztot!
Nekem is tetszik a dolog, bár én már hozzászoktam a screen-hez - így azt kis valószínűséggel cserélem le - de kipróbálni kipróbálom ha akad egy kis időm.
Ugyanakkor a háttérben futtatást kevés alakalommal használom. Legtöbbször akkor mikor sokkal később várom az eredményt és nohup-pal futtatva ott is hagyom a dolgot és kilépek és később visszatérve nézem meg az eredményt amit logba irányítok... ugye mindez szervereken...