Linux - AHA
Kleine und große Linux AHAs
Kleine und große Linux AHAs
05. Mai
Damit die Schriften “hübsch” sind, muss das Paket ttf-xfree86-nonfree installiert sein.
05. Mai
Eieieiei, immer wieder muss ich nachschauen und aufs neue den rpm Befehl zusammen basteln. Jetzt schreibe ichs mal auf:
RPMs inklusive Architektur auf einem 64bit RHEL System auflisten lassen:
rpm -qa --qf "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n"
Wenn ein Paket für mehrere Architekturen installiert ist, kann man mittels .
rpm -qi glib2.x86_64
Und deinstallieren des 64Bit Paketes:
rpm -e glib2.x86_64
04. Mai
Ronny hat mir grade eine kleine Bash Funktion geschickt, die mir ab jetzt viel Nerven sparen wird:
Wenn ein Server neu installiert wird (passiert bei uns schon ab und zu) ändern sich auch die SSH Server Keys. Beim nächsten Versuch, sich per SSH auf die neu installierte Maschine zu verbinden, verweigert SSH Aufgrund der Sicherheitseinstellungen den Dienst.
Es war dann immer umständlich, die alten Keys aus der known_hosts zu löschen.
Mit der folgenden Funktion (eingebaut in die .bashrc) geht das recht flott.
Als Übergabe nur die Zeilennummer mitgeben, die bei der SSH Fehlermeldung steht:
function sshknownhosts {
if [ $1 ]; then
sed -i ${1}d ~/.ssh/known_hosts
sed -i ${1}d ~/.ssh/known_hosts
echo "Zeile ${1} geloescht"
else
echo "Bitte Zeilennummer angeben"
fi
}
Sehr feines sed Skript zum löschen einer Zeile in einer Textdatei.
Thx Ronny!
04. Mai
Ich hatte oft die Anforderung, ein Skript nach dem nächsten Reboots eines Servers (genau ein mal) laufen zu lassen. Da ich ja, wie alle Admins faul bin und keine Lust hatte aufzupassen, wann ein Server neu gestartet wird, habe ich ein kleines SystemV Skript geschrieben, das mir diese Arbeit abnimmt.
ROAB – “Run Once After Boot” macht genau das was es sagt: Ein oder mehrere Skripte nach dem nächsten Reboot eines Servers genau einmal auszuführen. Dabei wird die Zeit und die Ausgaben der Skripte mit protokolliert, damit man im Nachhinein die Ausgaben auch kontrollieren kann. Außerdem kann nach erfolgter Arbeit ein weiterer automatischer Reboot konfiguriert werden.
Ich habe ein RPM für Red Hat erstellt. Also einfach installieren.
Wer das ganze zu Fuß machen will, hier das Skript. Dieses einfach nach /etc/init.d kopieren, ausführbar machen und mit “chkconfig roab on” in den Bootvorgang einbauen.
Download: roab-0.1-1.noarch.rpm (RPM für Red Hat Enterprise Linux)
Nun können beliebige Skripte und Programme nach /etc/roab/run.d/ gelegt werden, die dann, nach dem nächsten Reboot alphabetisch sortiert, gestartet werden. Alle Skripte und deren Ausgaben werden im Anschluss nach /etc/roab/run.log/ verschoben. Außerdem wird das Starten jedes Skriptes im Syslog (per logger) gemeldet.
Existiert die Datei /etc/roab/forcereboot, wird nach dem Ausführen aller Skripte ein Reboot des Systems durchgeführt.
Ausprobieren:
echo "touch /tmp/das_war_ein_roab_script" >/etc/roab/run.d/testscript
reboot
Nach dem Reboot ist das testcript-Script nicht mehr im run.d Verzeichnis, sondern in run.log zu finden. Außerdem die Ausgabe in <datum>testscript.log. In diesem Beispiel gab es ja keine Ausgabe, deswegen ist die Datei leer.
Das RPM einfach deinstallieren. Das Log Verzeichnis wird beibehalten.
Ich hoffe ROAB nimmt euch genau so viel Arbeit ab wie mir!
04. Mai
In vielen Scripten wird grep genutzt um den Inhalt eines Strings / einer Variablen innerhalb eines Shell Scripts zu prüfen. So etwas sieht dann schnell so aus (nur eine der Möglichkeiten):
test=blah
ret=`echo $test | grep -q la`
if [ $ret != 0 ]
then
echo "nicht gefunden"
else
echo "gefunden"
fi
Das ganze würde jedoch – wenigstens in dieser einfachen Form – auch anders gehen:
if [[ "$test" =~ "la" ]]
then
echo "ja"
fi
Der Vorteil dieser Lösung ist, dass kein weiterer Prozess für die Prüfung notwendig ist und das ganze somit um einiges schneller ist.
01. Mai
Ganz einfach – wenn man es mal gesehen / gefunden hat:
echo $((RANDOM % 100))
Das ergibt eine Zahl zwischen 0 und 100.
Möchte man lediglich die Zahlen zwischen 1 und 100 haben, so reicht diese kleine Änderung
echo $((RANDOM % 100 +1))
Das ganze ist ganz interessant für cronjobs. Viele Rechner sollen irgendwas machen, aber am besten nicht alle genau gleichzeitig. Also:
#
0 12 * * * root sleep $(( RANDOM \% 60 )); echo "blah"
Dieser Job würde dann zwischen 12:00 und 12:01 laufen. Wichtig dabei ist das maskierte Prozentzeichen – ansonsten funktioniert das ganze nicht.
29. Apr
Es gibt Anforderungen bei denen es nötig ist viele Befehle – möglicherweise mit verschiedenen Parametern – schnell ab zu arbeiten. Dabei kann man sich der Anzahl an Cores in einem Server (oder auch PC) bedienen. Eine Anforderung wäre zum Beispiel, dass immer so viele Prozesse gestartet werden, wie auch Prozessoren verfügbar sind. Das ganze möglichst ohne viel Drumherum – also ohne viel Installationsaufwand.
Eine ganz simple Möglichkeit stellt folgendes Script dar. Als Parameter wird jeweils der komplette Befehl angegeben. Standardmäßig laufen immer so viele Prozesse gleichzeitig wie Prozessoren vorhanden sind. Diese Zahl kann aber auch manuell vorgegeben werden. Das restliche Management übernimmt das Script selbst.
#!/bin/bash
#
# Ronny Becker, 05.2009
#
NUM=0
QUEUE=""
MAX_NPROC="none"
USAGE="A simple wrapper for running processes in parallel.
Usage: `basename $0` [-h] [-q] [-r] [-j nb_jobs] command command command command command command command command ...
-h Shows this help
-j nb_jobs Set number of simultanious jobs [def. CPU Count]
-q be quiet - do not output any information (but errors)
Examples:
`basename $0` somecommand somecommand somecommand ..."
# subs
function queue {
QUEUE="$QUEUE $1"
NUM=$(($NUM+1))
}
function regeneratequeue {
OLDREQUEUE=$QUEUE
QUEUE=""
NUM=0
for PID in $OLDREQUEUE
do
if [ -d /proc/$PID ] ; then
QUEUE="$QUEUE $PID"
NUM=$(($NUM+1))
fi
done
}
function checkqueue {
OLDCHQUEUE=$QUEUE
for PID in $OLDCHQUEUE
do
if [ ! -d /proc/$PID ] ; then
regeneratequeue # at least one PID has finished
break
fi
done
}
# parse command line
if [ $# -eq 0 ]; then # must be at least one arg
echo "$USAGE" >&2
exit 1
fi
while getopts j:qh OPT; do # "j:" waits for an argument "h" doesnt
case $OPT in
h) echo "$USAGE"
exit 0 ;;
j) MAX_NPROC=$OPTARG ;;
q) BE_QUIET=1 ;;
\?) # getopts issues an error message
echo "$USAGE" >&2
exit 1 ;;
esac
done
# get cpu information (cpu count = MAX_NPROC)
if [[ "$MAX_NPROC" =~ "none" ]]; then
CPUs=`cat /proc/cpuinfo | grep -c "processor.*[0-9]$" 2>/dev/null`
if [ $CPUs -gt 0 ]
then
MAX_NPROC=$CPUs
if [ ! $BE_QUIET ]; then echo "Found $MAX_NPROC CPUs - using $MAX_NPROC parallel threads"; fi
else
MAX_NPROC=2
if [ ! $BE_QUIET ]; then echo "Setting number of simultanous jobs to 2 - could not get CPU information"; fi
fi
fi
# Main program
shift `expr $OPTIND - 1` # shift input args, ignore processed args
# Count all Jobs
CMD_COUNT=$#
CMD_COUNT_ACT=0
# run forest run !!
while [ $# -gt 0 ] # for the rest of the arguments
do
# statistics
CMD_COUNT_ACT=$(($CMD_COUNT_ACT + 1))
# define command
CMD="$1"
shift
if [ ! $BE_QUIET ]; then echo -e "`date \"+%d.%m.%Y %H:%M:%S\"`: \033[1m [${CMD_COUNT_ACT}/${CMD_COUNT}]\033[0m Starting \033[1m${CMD}\033[0m"; fi
# run command
eval "$CMD &"
PID=$!
queue $PID
while [ $NUM -ge $MAX_NPROC ]; do
checkqueue
sleep 0.6
done
done
wait # wait for all processes to finish before exit
if [ ! $BE_QUIET ]; then echo -e "`date \"+%d.%m.%Y %H:%M:%S\"`: \033[1m all procs finished \033[0m"; fi
Das Original Script funktioniert ein wenig anders. Zu finden ist es hier
23. Mrz
Wir ? Das sind zwei. Ronny und Sascha. Wir sind Linux Admins und möchten auf dieser Seite von uns genannte “AHAs” sammeln. Unsere AHAs sind zum Beispiel kleine Code Scnippets, Tipps oder HowTos die alle mit Linux zu tun haben.
|
|
Unsere AHAs sind allerdings nicht einfach eine weitere Sammlung wie es schon so viele gibt. Wir möchten an dieser Stelle Informationen sammeln die wir selbst lange suchen mussten. Mal schauen was daraus wird … |