Inhaltsverzeichnis
Wichtige Shell Befehle für den DBA unter Linux / Solaris
Linux
VI Befehle
Suchen & Ersetzen | ||
---|---|---|
/ORA- | nach „Ora-“ suchen | |
/ | letzte Suche wiederholen | |
n | letzte Suche wiederholen | |
:s/Error/Fehler/ | in aktueller Zeile suchen & ersetzen | |
:2,12s/Error/Fehler/ | in Zeile 2 bis 12 suchen & ersetzen | |
:%s/Error/Fehler/ | in allen Zeilen suchen & ersetzen | |
Zeilen | ||
J | aktuelle Zeile an das Ende der vorhergehenden Zeile anhängen | |
:set number | Zeilennummer anzeigen | |
Löschen | ||
:2,12d | Zeilen 2 bis 12 löschen | |
:.,$d | alle Zeilen löschen („.“ = Anfang der Datei, „$“ = Ende der Datei) | |
Multiple Files | ||
:n | nächste Datei | |
:e# | vorherige Datei | |
:rew | gehe zur ersten Datei | |
:ar | Liste alle offenen Dateien auf |
vi graphical cheat sheet ⇒ http://www.viemu.com/vi-vim-cheat-sheet.gif
Tar
Zippt alle Dateien in einem Verzeichnis
tar cfvz archive.tar.gz /verzeichnis/
Entpackt
tar xfvz archive.tar.gz
df
Zeige nur die lokalen Filesystem „-l“ an und ein total „–total“, und das alles in einer Zeile in human readable format „-Ph“
df -Ph -l --total
grep
Zeilennummer mit ausgeben
grep -n "ORA-" alert.log
Zeilenweise um einen Treffer ausgeben mit Schalter -C
grep -C 3 "ORA-" alert.log
Treffer auschließen mit Schalter -v
grep -v "ORA-00" alert.log
Case insensitive suchen mit Schalter -i
grep -i "ORA-" alert.log
Nach mehr als einen Wort suchen Schalter -w mit „<suchwort2>\|<suchwort2“ als Regex, auf den \ achten!
grep -w "Service name\|Preferred instances" # oder besser grep --color -E "2005|2009"
Nur Dateinamen mit ausgegben -H, hilfreich beim Einsatz mit find:
find . -name "*.log" -exec grep -H clock {} \;
Recursive über Unterverzeichnisse suchen mit Schalter -R
grep -R 'my_file' /dir/
Find
Suche einen Text und überspringe alles was nicht gelesen werden kann:
find / -mount \! -readable -prune -o -path /dev -prune -o -name 'util_cmd' -ls
see http://stackoverflow.com/questions/762348/how-can-i-exclude-all-permission-denied-messages-from-find
Suche alle Files mit gesetzten S Bit und liste die Datei auf:
find . -type f -perm -4000 -exec ls -ld {} \;
Finde alle mit -mtime die nicht älter als x tage sind: (Man Page: -mtime n File's data was last modified n*24 hours ago )
find . -name "*_lgwr_*.trc" -mtime -1 -exec grep -H -A 1 "*** 2014-04-29 " {} \;
Finde all die älter als 160 Tage sind:
#Liste die Anzahl über die Tage auf: ls -la | awk '{ print $7 "-" $6 }' | sort | uniq -c #Alternativ über stat !Langsamer find . -name "*.aud" -exec stat -c %y {} \; | awk '{ print $1 }' | sort | uniq -c #Lösche Dateien die älter als 160 Tage sind: find . -name "*" -mtime +160 -exec rm {} \;
Finde alle Links die auf diese Datei zeigen über die inode id
ls -i iscsilogin.sh 526122 iscsilogin.sh cd /etc find . -follow -inum 526122 ./rc.d/init.d/iscsilogin.sh
Zeige die Ordner Größe an:
find . -maxdepth 1 -type d -print | xargs du -sm | sort -rn
Zeige die 5 ältesten und neuesten Dateien:
#älteste ls -ltr | head -5 #neuste ls -ltr | tail -5
Mehr Beispiele: http://content.hccfl.edu/pollock/unix/findcmd.htm
Zähle alle Dateien in diesem Directory:
find ${DATA_DIR}/* -maxdepth 0 -type f | wc -l
Änderungsdatum einer Datei mit stat
Mit dem stat befehlt lassen sich alle Datei Eigenschaften einfach auswerten
LASTTOUCH=$(stat -c %y backuo.log) LASTTOUCH=${MODDATE%% *} echo $LASTTOUCH
du
Wieviel Platz belegt ein Verzeichnis:
# eingeschränkt auf eine Ebene: du --max-depth=1 -h .
Alternatives Werkzeug ncdu, siehe ⇒ http://dev.yorhel.nl/ncdu
# install yum install http://download.opensuse.org/repositories/utilities/RHEL_6/i686/ncdu-1.10-13.2.i686.rpm #start ncdu
Alle Dateien die größer als 1GB sind:
find / -type f -size +1048576
ps
Beispiel nur das Kommando soll angezeigt werden:
ps -o cmd afx /u00/app/oracle/oem/12.1.0/agent/agent_inst/sysman/log/emagent.n \_ /u00/app/oracle/run.sh -root #Falls Treffer in der zweiten Zeile die führenden \ wieder entferenen ps -o cmd afx |grep -v grep | grep "root" | sed -e s/"\\\\_ "/""/g #gibt nur noch aus: /u00/app/oracle/run.sh -root
ps aux
- USER = user owning the process
- PID = process ID of the process
- %CPU = It is the CPU time used divided by the time the process has been running.
- %MEM = ratio of the process’s resident set size to the physical memory on the machine
- VSZ = virtual memory usage of entire process
- RSS = resident set size, the non-swapped physical memory that a task has used
- TTY = controlling tty (terminal)
- STAT = multi-character process state
- START = starting time or date of the process
- TIME = cumulative CPU time
- COMMAND = command with all its arguments
Xargs
Textausgabe in einer Pipe wiederum als Argument für ein nachfolgendes Programm verwenden.
Hier ein gutes Beispiel: http://sidvind.com/wiki/Xargs_by_example
find . -name "*_lgwr_*.trc" -exec ls -ld {} \; | xargs -0 echo
AWK
Ein einfache Hochkomma in einer Ergebnissliste erzeugen beim Aufruf von AWK in der Bash
Leider ist mir bisher nicht gelungen dazu die richtige Escape Squence zu finden.
Beispiel
ps uafx | grep smon | awk '{ print "@"$1"@" }' | sed -e s/"@"/"'"/g 'oracle' 'oracle2'
Mit Field Seperator und Such Ausdruck Wert aus einer Datei lesen
„-F“ Fild Seperator setzen - Suche in aktueller Zeile mit /<suchstring>/ und Ausgabe des zweiten Wertes:
awk -F: ' /grid/ {print $2}' /etc/oratab
watch
einen Befehl alle n sekunden wiederholen
watch -n 10 "df | grep backup"
who
last reboot
who -b system boot 2013-01-21 04:51 uptime # see the value behind up!
Aktueller Run Level
who -r run-level 3 2014-07-30 06:47 last=S
Wer ist angemeldet
who -u
ssh key austausch
Auf drei Knoten unter den User Oracle Key's erzeugen und dann verteilen
As User oracle on node 1 #generate key on every node ssh-keygen -t rsa ssh cGPIrac2 ssh-keygen -t rsa ssh cGPIrac3 ssh-keygen -t rsa # Copy public key from one node to the other #2/3 to 1 ssh cGPIrac2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh cGPIrac3 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #1/3 to 2 ssh cGPIrac2 ssh cGPIrac1 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh cGPIrac3 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #1/2 to 3 ssh cGPIrac3 ssh cGPIrac1 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh cGPIrac2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
Befehle auf meheren Knoten ausführen
Per Schleife und ssh :
for i in {1..4}; do ssh gpi-nosql0$i "hostname ;date ; exit"; done
Datei erzeugen mit dd
Eine Test Datei mit mit 1GB Größe mit dd anlegen:
dd if=/dev/zero of=copy_test_file.dmp bs=1M count=1000
In allen Dateien Änderungen durchführen
In allen Dateien eines Verzeichnisses das vorkommen eines wortes durch ein anderes ersetzen.
!/bin/bash for file in $(grep -l -R $searchterm $startdirectory) do sed -e "s/$searchterm/$replaceterm/ig" $file > /tmp/tempfile.tmp mv /tmp/tempfile.tmp $file echo "Modified: " $file done
Was liegt hier so großes im Verzeichnis herum?
Mit du und sort die großen Daten suchen
du -skx * | sort -nk 1,1
Wer hat welche Datei gerade offen - show open files
lsof hilft hier weiter
unter /usr/sbin oder /sbin
lsof | grep oracle
fuser - wer verwendet das Verzeichnis
unter /sbin
/sbin/fuser -m -a -v $ORACLE_HOME
Unter welchen Rechten läuft ein Prozess wie der listner
Über die Datei /proc/<sid>/status kann geprüft werden, mit welchen Rechten ein Prozess in Linux gestartet wurde.
ps uafx | grep LISTENER oracle 1777 .... cat /proc/9177/status Name: tnslsnr State: S (sleeping) SleepAVG: 98% Tgid: 9177 Pid: 9177 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 502 502 502 502 FDSize: 512 Groups: 602 703 1004 1009 1044 1006 1630 ...
Firewall - Open Ports vom Client testen
Auf einer Maschine soll vorab gepürft werden ob der Listener ereichbar wäre. Leider ist aber noch nichts zum prüfen installiert.
Ziel: Testen ob in einer FW schon der Port freigeschaltet ist, im Beispiel der 1521:
mit nc (siehe Manpage nc eine Listen Port auf dem Target erzeugen:
# start on server a process on port 1521 # ein Port nc -l $HOSTNAME 1521 # nc gleichzeitig auf mehreren ports starten export first_port=3100 export last_port =3140 for (( i = first_port; i <= last_port; i++ )) do nc -l $HOSTNAME ${i} & done
Mehr über nc siehe hier http://www.sans.org/security-resources/sec560/netcat_cheat_sheet_v1.pdf
Mit telnet oder curl dann vom Client testen ob der Server unter diesem Port erreichbar ist:
telnet my_server_name 1521 #alternativ wenn kein Telnet mehr zur Verfügung steht: curl http://my_server_name:1521 #alternativ mit nc mit der z option nc -z my_server_name 1521 Connection to my_server_name 1521 port [tcp/*] succeeded! # alternativ mit nc über einen ganzen Port Range nc -z my_server_name 5100-5140 # timing time yes | nc -z my_server_name 1521 real 0m0.004s user 0m0.002s sys 0m0.002s # alternativ mit gnu time /usr/bin/time -f %E nc -z my_server_name 6838
TCP Dump
Alle Packete von und zu einem Host protokollieren:
# -X mit dem Content der Packete! tcpdump -nnvvSX <host_name or IP>
Siehe auch
Blocksize eines Filesystems und die maximale Größe einer Datei
mit fstune -l <dev> kann diese Information angezeigt werden
tune2fs -l /dev/sda
siehe auch ⇒ http://www.howtoadvice.com/Ext3Max
Crontab:
crontab -e # Minute Hour Day of Month Month Day of Week Command # (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) 01 14 20 02 * /home/oragpi/scripts/call_rman_script.sh
Cron Tab Examples
Einen Befehl zur Ausführung sofort zur Crontab einmalig hinzufügen:
at now >script.sh # close and start the script with ^d
Ein Guter Generator ⇒ https://crontab-generator.org/
Mit welchen Parametern wurde der Kernel gestartet
cat /proc/cmdline
strace - was wird von einem Programm alles verwendet/aufgerufen
Schalter:
- -f - Child Prozesse mit ein beziehen ( mit -ff und -o <output_file> pro child eine eigene Output Datei )
- -e - filteren zum Bespiel nur auf read oder open Calls
Welche Hardware ist installiert
Zum Beispiel um die Netzwerkkarten anzueigen:
# lshw -class network
Hex IP Adressen interpretieren
Gelegentlich wird eine IP Adresse als HEX Wert ausgeben. Ein Beispiel ist die Output von „onsctl debug“ im Oracle Real Application Cluster.
onsctl debug ... b42 0000:0000:0000:0000:0000:ffff:0aB8:7c12 .. # Umwandeln mit # auf die großschreibung achten! for i in A B8 7C 12 do printf "%d." $(echo "ibase=16; $i" | bc) done # oder als kleine Funktion hexIP_decIP(){ echo -n $(echo "ibase=16; $1" | bc). echo -n $(echo "ibase=16; $2" | bc). echo -n $(echo "ibase=16; $3" | bc). echo -n $(echo "ibase=16; $4" | bc) }
Yum
Mit Yum ein normales RPM Packet installieren, um zum Beispiel Chrome auf einem Server ohne Internet Zugang.
Schalter –nogpgcheck und Parameter localinstall:
yum --nogpgcheck localinstall google-chrome-stable_current_x86_64.rpm
Dateien zusammen fügen
Paste
Zwei Datein Spalten weise zusammen fügen:
data1
A B C D
data2
10 20 30 40
Zusammenfügen mit einen „,“ als Trenner:
paste -d "," data1 data2 A,10 B,20 C,30 D,40
Alternativ Daten Transponieren mit „paste -s“
paste -s data1 data2 A B C D 10 20 30 40
Quelle ⇒ http://www.problem-hilfe.de/linux/h/Shells/paste.html
Dateien anhängen
cat data1 data2 > data3
Bash Scripting Examples
Solaris
Prozess Argumente anzeigen
Tool pargs
siehe http://www.c0t0d0s0.org/archives/4779-Less-known-Solaris-Features-Getting-the-command-line-and-environment-of-running-processes.html
md5 solaris anzeigen
Immer daran denken die checksum von Installationspaketen zuprüfen, nicht das was fehlt!
digest -v -a md5 p8202632_10205_SOLARIS64.zip md5 (p8202632_10205_SOLARIS64.zip) = 4caeb39adc1aac52e6146f970e9378d6
Hostname mit Domain anzeigen lassen
echo $(hostname).$(domainname)
32/64 bit Kernel ?? in solaris anzeigen
#Betriebsystem /usr/bin/isainfo -kv 64-bit amd64 kernel modules # #für die installierte Oracle Version file $ORACLE_HOME/bin/oracle oracle: ELF 64-bit LSB executable AMD64 Version 1, dynamically linked, not stripped