grep voodooo

November 26th, 2012 § 3 comments § permalink

Seit einigen Wochen nutzen wir u.a. fuer Swopspot den github-clone gitlab. Soweit - Sogut. Alles schoen. Doof nur, das der verwendete resque server abundan aussteigt und dann werden die Aenderungen der git-repositories nicht an gitlab weitergereicht. Also bekomm ich dann (nach dem die Notifications zwei Tage haengen) eMails mit der Bitte mal zu gucken... Das spiel habe ich dann jetzt drei mal gespielt und keine Lust mehr gehabt... Nachdem man einmal weis woran es liegt kann man das bequem die Maschine uebernehmen lassen...

Also dachte mir ich, k bauste fix nen shell script, was guckt ob sich irgendwo noch resque Prozesse finden, und wenn nicht, dann starte ihn halt wieder...

Dann sah die erste Version so aus:

 #!/bin/bash

FINDRESQUEPROCESS=$(echo `ps -ef | grep resque | grep -vc grep`)
# den grep Prozess wollen wir natuerlich nicht mitzaehlen ;)
# -v invertiert die Suche und -c zaehlt die Ergebnisse

if [ $FINDRESQUEPROCESS != "0" ]; then
  echo "resque is running."
  echo "nothing to do here."
  exit 0
else
  echo "resque is not running!"
  echo "starting resque for you..."
  sudo su - gitlab bash -c "cd gitlab && ./resque.sh && exit"
  exit 0
fi
exit 1

# ./check-resque.sh
4

4? Sollte dort nicht 1 stehen? Mhm...
Also lassen wir uns testweise mal ausgeben was gefunden wird.

# ./check-resque.sh
gitlab 11727 1 0 01:04 ? 00:00:05 resque-1.20.0: Waiting for post_receive,mailer,system_hook
root 23013 5903 0 13:51 pts/9 00:00:00 /bin/bash ./check-resque.sh
root 23014 23013 0 13:51 pts/9 00:00:00 /bin/bash ./check-resque.sh
root 23015 23014 0 13:51 pts/9 00:00:00 /bin/bash ./check-resque.sh

Gut, das erklaert die Sache, das Script enthaelt natuerlich auch resque im Namen und wird somit gefunden. Also muessen wir das Script selbst auch aus dem Ergebniss nehmen.

 #!/bin/bash

THISSCRIPT=`basename $0`
FINDRESQUEPROCESS=$(echo `ps -ef | grep resque | grep -v $THISSCRIPT | grep -vc grep`)

if [ $FINDRESQUEPROCESS != "0" ]; then
  echo "resque is running."
  echo "nothing to do here."
  exit 0
else
  echo "resque is not running!"
  echo "starting resque for you..."
  sudo su - gitlab bash -c "cd gitlab && ./resque.sh && exit"
  exit 0
fi
exit 1

Cron fuehrt das Script jetzt einfach alle 30 Minuten aus und Ruhe is' (hoffentlich).

youtube-dl-agent

January 22nd, 2011 § 3 comments § permalink

youtube-dl-agent laedt eine liste von youtube-videos mit youtube-dl runter, konvertiert sie mit ffmpeg und fuegt sie mit mencoder zusammen. gedacht fuer splited youtube-videos.

usage:

$ youtube-dl-agent http://www.youtube.com/watch?v=Qpwj5k0zYDs \
http://www.youtube.com/watch?v=XCyXY4jLxo8 \
http://www.youtube.com/watch?v=BwJUV8vvGyA \
http://www.youtube.com/watch?v=xQuyiMravE4 \
--output="Weimar nach der Wende.avi"
#!/bin/bash

case "$1" in

  "" )
      exit $E_PARAM ;
  ;;

  * )
    TEMPPATH=$PWD"/youtube-dl-agent.swap/";
    mkdir $TEMPPATH;
    cd $TEMPPATH;

    for i in "$@"
    do
      case "$i" in
        http://* )
            URL=`echo $i`;
            echo " * * * "$URL" * * *";

            ###
            # DOWNLOAD FLV WITH YOUTUBE-DL
            /usr/local/bin/youtube-dl -t $URL

            ###
            # FIND DOWNLOADED FLV FILE BY ID
            ID=`echo $URL | /bin/sed -r 's/.*v=(.*)$/\1/'`;
#            echo $ID;
            IDS=$IDS$ID" ";

            FLV=`/usr/bin/find $PWD"/" -maxdepth 1 -name "*$ID.flv"`;
#            echo $FLV;
            FLVS=$FLVS$FLV" ";

            ###
            # COVERT FLV TO AVI
            /usr/bin/ffmpeg -i $FLV -vcodec copy \
            -acodec libmp3lame -ab 128k $FLV".avi"

            AVI=`/usr/bin/find $PWD"/" -maxdepth 1 \
            -name "*$ID*.avi"`;
#            echo $AVI
            AVIS=$AVIS$AVI" ";
        ;;

        # STRINGS WITH WHITESPACES HAVE TO BE
        # ENCAPSULATE WITH DOUBLE QUOTES
        --output=* )
            OUTPUT=`echo $i | sed 's/--output=//'`;
        ;;

        * )
            exit $E_PARAM ;
        ;;

      esac
    done
  ;;

esac

###
# MERGE SPLIT AVIS
/usr/bin/mencoder -ovc copy -oac copy $AVIS -o $OUTPUT

###
# MOVE FROM TEMP-DIR TO $USERS PWD
/bin/mv -v $OUTPUT ..

###
# CLEAN UP
/bin/rm -rv $TEMPPATH

exit 0

irgendwas bei 350 zeilen interface fuer einen one-liner

November 26th, 2010 § 3 comments § permalink

erinnert ihr euch an mein problem? das konnte ich nun doch sehr elegant loesen:

ed@mediathek:~$ find Media/Movies/ -name "*.nfo" -print0 | \
  xargs -0  egrep -i -c -e "countr.*dd|genre.*sci-fi|year.*196" | \
  grep ":3" | sort | sed 's/:3//'
Media/Movies/Der Schweigende Stern (1960)/\
  Der Schweigende Stern (1960).nfo
Media/Movies/First Spaceship on Venus (1962)/\
  First Spaceship on Venus (1962).nfo

und bevor ich das rausfand wurde mir im irc noch gesagt, ich koennte keine scheisse aufpolieren und solle das lieber in perl oder besser noch in python programmieren! und am ende habe ich es doch in einem one-liner untergebracht :P

damit das auch nachhaltig ist und benutzbar bleibt, habe ich mir das ziel gesetzt, nun auch in der bash das interface zuprogrammieren. nach ganz viel case-voodoo wird am ende auch nur wieder

 /usr/bin/find $DIR -type f -name "*.nfo" -print0 | \
  xargs -0 egrep -c -i -e "$EXPRESSION" | \
  grep ":$COUNTER" | sort | \
  sed 's/:'$COUNTER'//' | sed -r 's/^.*\/(.*)\/.*/\1/'

ausgefuehrt. in der benutzung sieht das dann z.b. so aus:

ed@mediathek:~$ mediathek-cli-search --country=dd --genre=sci-fi \
  --year=196
Der Schweigende Stern (1960)
First Spaceship on Venus (1962)

# link zum source von extern und von intern

die man-page und die bash-completion bau ich dann morgen oder so...

ed@mediathek:~$ mediathek-cli-search 
USAGE:
 mediathek-cli-search [OPTION=VALUE]...

OPTIONS: 
 --help
 --title
 --orignaltitle
 --alternativetitle
 --englishtitle
 --germantitle
 --year
 --country
 --director
 --genre
 --length 
 --dub 
 --sub
 --subfiles
 --source
 --videoformat 
 --resolution
 --aspectratio

EXAMPLES:
 mediathek-cli-search --help=OPTION
 mediathek-cli-search --country=dd --genre=sci-fi
 mediathek-cli-search --country=jp --genre=action \
   --year=199
 mediathek-cli-search --director=vertov
 mediathek-cli-search --dub=en --subfiles=de \
   --genre=horror

seit stunden droehnt der inhalt des goldenen doeschen (neben dem auch der benjamin liegt) in mein hirn und psychodelischer trance (den marv mitgebracht hat) in mein ohr.

uselessfancycolorbashvoodoo

August 5th, 2010 § 0 comments § permalink

So sollte ich eher eine neue kategorie nennen...

Worum soll es nun eigentlich gehen? Um farben. Um das problem wie man in eine bunte farbige bash mit ssh und screen und da drin wieder einer bash und wie man eben diese letzte auch vollends in farbe und bunt sich baut. Meine bash jedenfalls war nur teils bunt. Also der ganze xterm-wir.machen.datei.listigs.bunt und so stuff war schon entsprechend der ~/.bashrc dargestellt wurden, nur die prompt sah etwas blass aus. Also ging ich auf die suche. 2 tage spaeter war ich dann endlich mal soweit mich dem eigentlichen problem zunaehern, denn zwischendurch hab ich mir ne ~/.screenrc gebaut, viel spass am geraet mit ssh & screen spielerein und zugriffsrechten auf terminals gehabt. Na jedenfalls lag das problem der unfarbigen bash-promt in der screen-session doch bei screen (dem man -T xterm-color uebergeben muss), was ich aber durch den eintrag alias screen='screen -T xterm-color' in der ~/.bashrc loeste. erwaehnen sollte man aber, dass das anscheinend nur klappt, wenn man screen aus dem ssh-terminal heraus startet und nicht durch $ ssh user@server -t screen denn dann ist die bash-prompt in screen wieder etwas weiss um die nase. denn dazu braeuchte es den alias-eintrag in der lokalen .bashrc!

Also, noch was unklar?

6 Tips für mehr BASH awesomeness

May 16th, 2010 § 7 comments § permalink

Hier ein paar Tips wie man die Bash-Shell pimpen kann:

1) History Search mit Pfeiltasten

Die wenigsten wissen, dass man in der History springen kann (wie mit den hoch/runter-Tasten), aber dabei nur die Einträge angezeigt bekommt, die mit der bereits getippten Zeile beginnen. Das liegt wohl daran, dass es standardmäßig keine Keymappings dafür gibt. Macht aber nix! Man kann sich das ganz leicht zusammenschrauben wenn man folgendes in seine ~/.inputrc einträgt:

# up arrow: go to previous line in history
# that starts with the typed characters
"\e[B": history-search-forward
# down arrow: opposite of up arrow
"\e[A": history-search-backward

Super praktisch. Must have. Und das beste daran: wenn man noch nichts eingetippt hat verhält sich das ganze wie gewohnt, man geht einfach die History rauf und runter.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

2) Case-Insensitive Tab Completion

Folgende Zeile in der ~/.inputrc ist auch äußerst empfehlenswert und bewirkt, dass man die Tab-Completion für Ordner und Dateien verwenden kann, selbst wenn man sich mit der Groß/Kleinschreibung vertan hat:

# case-insensitive tab completion
set completion-ignore-case on

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

3) GREP in Farbe

Jeder ernsthafte Bash-Nutzer verwendet mehrmals täglich grep. Man kann sich die gefundenen Stellen (standardmäßig Rot) hervorheben lassen, um leichter zu erkennen welcher String nun genau wo gefunden wurde. Dazu folgende Zeile in der ~/.bashrc bzw. ~/.bash_profile einfügen:

export GREP_OPTIONS="--color=always"

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

4) Man-Pages in Farbe

Ubuntu macht das glaub ich mittlerweile standardmäßig. Das ist aber kein Feature von "man", sondern liegt am verwendeten Pager. Wers haben will installiert "most" (ersatz für den standard-pager "less") und fügt folgende Zeile zu seiner ~/.bashrc bzw. ~/.bash_profile hinzu:

export PAGER="most"

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

5) Git und Mercurial-Branches im Prompt anzeigen lassen

Wer git oder mercurial für sein Source-Code-Management verwendet wird sich hin und wieder nicht ganz sicher sein, auf welchem Branch er sich gerade befindet. Für mich haben sich folgende Funktionen als sehr nützlich erwiesen:

# show current git branch
git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1) /'
}
# show current mercurial branch
hg_branch() {
    hg branch 2> /dev/null | awk '{printf "(%s) ",$1}'
}

Diese geben den aktuellen Branch in Klammern, gefolgt von einem Leerzeichen aus, wenn man in einem Repository ist. Falls nicht, geben sie einfach gar nichts aus, man wird also nicht permanent davon genervt. Verwendung in der ~/.bashrc bzw. ~/.bash_profile :

export PS1="\$(git_branch)${PS1}"

Damit sieht mein Prompt dann in einem Mercurial Repository z.B. so aus:

(default) user@host:my_repository$

und wenn ich nicht in einem Repository bin so:

user@host:/$

Man kann das auch noch farblich hervorheben. Dazu erstmal ein paar handliche Variablen für die Farben, muss ja nich jeder das Rad neu erfinden:

# default
NO_COLOR='\[33[0m\]'

# standard colors
BLACK='\[33[0;30m\]'  RED='\[33[0;31m\]'
GREEN='\[33[0;32m\]'  YELLOW='\[33[0;33m\]'
BLUE='\[33[0;34m\]'   MAGENTA='\[33[0;35m\]'
CYAN='\[33[0;36m\]'   WHITE='\[33[0;37m\]'

# emphasized colors
EBLACK='\[33[1;30m\]' ERED='\[33[1;31m\]'
EGREEN='\[33[1;32m\]' EYELLOW='\[33[1;33m\]'
EBLUE='\[33[1;34m\]'  EMAGENTA='\[33[1;35m\]'
ECYAN='\[33[1;36m\]'  EWHITE='\[33[1;37m\]'

# underlined colors
UBLACK='\[33[4;30m\]' URED='\[33[4;31m\]'
UGREEN='\[33[4;32m\]' UYELLOW='\[33[4;33m\]'
UBLUE='\[33[4;34m\]'  UMAGENTA='\[33[4;35m\]'
UCYAN='\[33[4;36m\]'  UWHITE='\[33[4;37m\]'

# background colors
BBLACK='\[33[40m\]'   BRED='\[33[41m\]'
BGREEN='\[33[42m\]'   BYELLOW='\[33[43m\]'
BBLUE='\[33[44m\]'    BMAGENTA='\[33[45m\]'
BCYAN='\[33[46m\]'    BWHITE='\[33[47m\]'

Wenn man jetzt das repository statt in der default-farbe lieber in grün haben will macht man das so:

export PS1="$GREEN\$(git_branch)$NO_COLOR${PS1}"

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

6) LS in Farbe

Last but not least noch ein Tip, um ls ein bisschen mehr Leben einzuhauchen. Manche Leute bekommen Augenkrebs, ich finde es praktisch, wenn Verschiedene Arten von Dateien verschiedene Farben bekommen. Unter Linux ganz einfach in die ~/.bashrc bzw. ~/.bash_profile eintragen:

alias ls='ls --color=auto'

# standard, directories, symlinks
LS_COLORS="no=00:di=34:ln=35:so=33"
# executables white with red background
LS_COLORS="ex=37;41:${LS_COLORS}"
# archives cyan
LS_COLORS="*.zip=36:*.rar=36:*.tar=36:*.gz=36:*.tar.gz=36:*.7z=36:${LS_COLORS}"
# source files green
LS_COLORS="*.c=32:*.cpp=32:*.rb=32:*.pl=32:*.php=32:${LS_COLORS}"
# header files yellow
LS_COLORS="*.h=33:*.hpp=33:${LS_COLORS}"
# object files grey
LS_COLORS="*.o=30:*.d=30:${LS_COLORS}"
export LS_COLORS

Alle verfügbaren Optionen und Farben sind hier gut aufgelistet, da kann dann jeder nach Lust und Laune rumbasteln wie er will.

Da Mac OS nicht die GNU coreutils (also ls, cp, mkdir, ...) verwendet sondern die BSD-Variante, die sich nicht so detailiert konfigurieren lässt, muss man hier erst die GNU coreutils mittels Macports nachinstallieren. Das Kommando dazu:

sudo port install coreutils

Wenn man das getan hat, sind die GNU coreutils verfügbar, indem man den gewohnten Kommandos einfach ein "g" voranstellt ( also z.B. gls, gcp, gmkdir ). Das bedeutet dass man das alias also folgendermaßen setzen muss:

alias ls='gls --color=auto'

Wer noch mehr awesomeness parat hat, ab damit in die Comments! Und jetzt viel Spass beim Ausprobieren wünscht euch euer Onkel Padde.

Where Am I?

You are currently browsing entries tagged with bash at maschinenraum.