====== 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 "**\**|
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 // 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//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 [[http://linux.die.net/man/1/nc| 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
== Siehe auch ==
* http://www.danielmiessler.com/study/tcpdump/
* http://www.thegeekstuff.com/2010/08/tcpdump-command-examples/
* http://openmaniak.com/tcpdump.php
----
===== Blocksize eines Filesystems und die maximale Größe einer Datei =====
mit fstune -l 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
see http://www.pantz.org/software/cron/croninfo.html
===== Cron Tab Examples =====
* http://www.pantz.org/software/cron/croninfo.html
* http://www.corntab.com/
* http://ratgeber-community.com/wiederkehrende-aufgaben-von-crontab-als-cronjob-ausfuehren-lassen-6dd0292e
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 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 [[https://www.google.com/intl/en/chrome/browser/?platform=linux|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 =====
* [[linux:bash_script_snippets|Bash Snippets für Skripting]]
* http://tldp.org/LDP/abs/html/
----
----
====== 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
----