Archiv der Kategorie: Debian

Neue Festplatte installieren und einrichten

Um zusätzlichen Speicherplatz zu erhalten, ist es bei Linux (wie bei jedem anderen Betriebssystem) notwendig, eine zusätzliche Festplatte zu installieren. Man könnte auch die alte ersetzen, doch dann würde man das Betriebssystem wohl eher neu installieren. Um eine zusätzliche Festplatte unter Linux zu installieren, sind die folgenden Schritte notwendig:

1. Computer ausschalten und Gehäuse öffnen. Dann die Festplatte einbauen und an einen freien IDE-Anschluss anschließen. 2. Sobald die Festplatte eingebaut und angeschlossen ist, sollte sie beim Booten des Rechners automatisch erkannt werden. Um die Gerätedateien der Festplatte unter Linux herauszufinden, kann die folgende Liste verwendet werden: Primary Controller – Festplatte 1: /dev/hda Primary Controller – Festplatte 2: /dev/hdb Secondary Controller – Festplatte 1: /dev/hdc Secondary Controller – Festplatte 2: /dev/hdd

Man benötigt diese Informationen, um die neue Festplatte unter Linux einzurichten.

3. Nun, da wir wissen, wie unsere Festplatte unter Linux heißt (z. B. /dev/hdb), ist der nächste Schritt, die Platte mit fdisk zu partitionieren fdisk /dev/hdb

Die bevorzugte Methode ist es, die alten Partitionen auszuwählen und eine einzelne Linux-Partition hinzuzufügen. Wichtig ist, dass die Partition vom Typ 83 (Linux) ist.

   * Drücke "n", um eine neue Partition hinzuzufügen
   * Drücke "e", um die neue Partition zu einer primären Partition zu machen (abä¤ngig davon, wieviele Partitionen erstellt werden)
   * Drücke "1" für eine einzelne Partition
   * Gib den ersten Zylinder ein, z.B. "1"
   * Gib den letzten Zylinder ein, z.B. 1245 (abä¤ngig von der Größe der Festplatte)
   * Drücke "w", um die Partitionstabelle auf die Festplatte zu schreiben und fdisk zu beenden

4. Wenn die Partition erstellt ist, muss mit mkfs das Dateisystem erstellt werden. Wenn nur eine Partition erstellt wurde, dürfte diese beispielsweise /dev/hdb1 heißen. In diesem Fall ist mkfs /dev/hdb1

einzugeben, um ein Dateisystem zu erzeugen. Für mehrere Partitionen funktioniert das analog. Nach mkfs /dev/hdb1 wäre dann mkfs /dev/hdb2 usw. auszuführen, bis alle Partitionen mit einem Dateisystem versorgt sind.

Das neu erstellte Dateisystem sollte standardmäßig als Dateisystem vom Typ ext2 erstellt werden. Falls Du ein Dateisystem vom Typ ext3 (ext2 + Journal) haben möchtest, dann ist

tune2fs -j /dev/hdb1

für alle Partitionen und Dateisysteme auszuführen, die auf der Festplatte eingerichtet wurden.

5. Im nächsten Schritt ist ein Mountpoint zu erstellen, an dem die neue Festplatte gemountet werden soll. Das kann so geschehen: mkdir /dir

Das neue Dateisystem kann dann mit folgendem Befehl getestet werden:

mount /dev/hdc1 /dir -t ext3

Mit folgendem Befehl kann das Dateisystem wieder unmounted werden:

umount /dir

6. Zum Schluss ist noch ein Eintrag in /etc/fstab zu erstellen, der das neue Dateisystem beschreibt und es ermöglicht, dass es beim Booten des Rechners automatisch gemounted werden kann. Dies kann dann mit dem Befehl mount all

getestet werden.

In der fstab ist eine Zeile ähnlich dieser hinzuzufügen:

/dev/hdX# /dir/to/mount extY defaults 0 1

Dabei entspricht das X dem Buchstaben aus der o.g. Liste und # der Partitionsnummer. Y bezeichnet den Typ des Dateisystems (z.B. 2 für ext2 und 3 für ext3).

RPM Pakete unter ubuntu/debian installieren

# apt-get update
# apt-get install alien
#alien -k file.rpm

Die -k Option dient dazu, daß alien die Versionsnummer des Paketes nicht verändert. Ansonsten fügt alien ein “l” der Versionsnummer hinzu.

#dpkg -i name-of-deb-file.deb

Verzeichniss mit Tar und GZIP archivieren und komprimieren

Endung: “tar”

Archive mit der Endung “tar” sind reine Zusammenfassungen von Dateien. Es wird die Verzeichnisstruktur gespeichert, der Inhalt aber nicht komprimiert. Weiterhin werden in einem Tar-Archiv zu jeder Datei die Rechte und Eigentümer gespeichert. Daher ist “tar” das bevorzugte Archivformat unter Linux bzw. Unix.

Ein “tar”-Archiv wird mit folgendem Befehl ausgepackt:

tar xfv [ARCHIVNAME].tar

Die Optionen bedeuten folgendes: “x” steht für extract, also auspacken, “f” für file (aus einer Datei) und “v” für verbose (gesprächig). Verwendet man statt “x” ein “c” (create), kann man Verzeichnis und/oder Dateien einpacken und ein eigenes Archiv erzeugen.

tar cfv [ARCHIVNAME].tar [VERZEICHNIS1] [VERZEICHNIS2] [DATEI1] [DATEI2]

Möchtest du dir den Inhalt eines Archives auflisten lassen, so verwendest du den Schalter “t”:

tar tfv [ARCHIVNAME].tar

Endung: “gz”

Eine Datei mit der Endung “gz” steht für eine mit gzip komprimierte Datei. Es kann jedoch nur eine einzige Datei komprimiert werden. Wenn du mehrere Dateien komprimieren möchtest, musst du aus diesen erst einmal ein Archiv erstellen (siehe oben). Der folgende Befehl komprimiert eine Datei:

gzip [DATEINAME]

Als Ergebnis erhält man die Datei namens “[DATEINAME].gz”. Genauso einfach kann man diese wieder dekomprimieren:

gunzip [DATEINAME].gz

Das Ergebnis ist wieder der ursprüngliche Dateiname [DATEINAME]. Das tar-Kommando kann übrigens komprimierte Archive erzeugen bzw. entpacken:

tar cfvz [ARCHIV].tar.gz [VERZEICHNIS1] [DATEI1]
tar xfvz [ARCHIV].tar.gz

Manchmal findet man übrigens Archive mit der Endung “tgz”. Das ist jedoch nichts anderes als “tar.gz”.

Endung: “bz2”

Die Handhabung einer Datei mit der Endung “bz2” verhält sich ähnlich wie bei einer “gz”-Endung. Der Vorteil von “bz2” sind die bedeutend kleineren Dateien. Beim Linux-Kernel oder ISO-Images sind es einige MB. Der folgende Befehl komprimiert eine Datei:

bzip2 [DATEI]

Das Ergebnis ist eine Datei namens “[DATEI].bz2”. Das Dekomprimieren funktioniert ähnlich:

bunzip2 [DATEI].bz2

Das tar-Kommando kann das Zusammenfassen und Komprimieren bzw. Dekomprimieren und Auspacken auch in einem Schritt erledigen:

tar cfvj [ARCHIV].tar.bz2 [VERZEICHNIS1] [DATEI1]
tar xfvj [ARCHIV].tar.bz2

Sollte das Entpacken einer *.tar.gz Datei mit dem tar-Kommando nicht funktionieren, gibt es auch noch eine andere, aber kompliziertere Möglichkeit:

gzip -dc [DATEI].tar.gz | tar xfv -

Der erste Befehl dekomprimiert die Datei und schickt das Ergebnis auf die sogenannte “Pipe”. Das tar-Kommando greift sich von dieser “Pipe” die Daten und entpackt diese. Die “Pipe” kann man sich wie eine Zwischenablage vorstellen.

Hinweis: Wenn man beim Kommando “tar” ein Minus vor die Optionen setzt, dann wird die Angabe für den Dateinamen (“f”) als letztes erwartet, z. B. “tar -xvzf datei.tgz”. Andernfalls gibt es eine Fehlermeldung.

Endung: “zip”

ZIP-Dateien wurden und werden noch immer hauptsächlich unter DOS bzw. Windows verwendet. Zum Datenaustausch zwischen Linux und Windows sollte dieses Format bevorzugt werden. Der folgende Befehl komprimiert einzelne Dateien:

zip [ARCHIV].zip [DATEI1] [DATEI2]

Möchte man hingegen Dateien in einer kompletten Verzeichnisstruktur archivieren, so lautet das Kommando:

zip -r [ARCHIV].zip [VERZEICHNIS1] [VERZEICHNIS2]

Mit dem folgenden Befehl kann man sich den Inhalt eines ZIP-Archivs ausgeben lassen:

unzip -l [ARCHIV].zip

Zuguterletzt kann ein ZIP-Archiv auch wieder entpackt werden:

unzip [ARCHIV].zip

Der ZIP-Algorithmus wird beispielsweise von OpenOffice.org verwendet, um die XML-Daten zu komprimieren.

Ubuntu HA-Cluster mit DRBD und Heartbeat

einfache Grundconfig für einen 2Node Cluster mit Apache2 Mysql PHP5

apt-get install heartbeat drbd8-utils
apt-get install apache2 php5 mysqlserver libapache2-mod-php5

DRBD

drbd.conf
nano /etc/drbd.conf
global {
   usage-count yes;
}
common {
 syncer {
   rate 100M;
 }
}
resource web {
 protocol C;
 handlers {
 pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
 pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
 local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
#  outdate-peer "/usr/sbin/drbd-peer-outdater";
 }
 startup {
   wfc-timeout         0;  ## Infinite!
   degr-wfc-timeout  120;  ## 2 minutes.
 }
 disk {
   on-io-error detach;
 }
 net {
   # timeout           60;
   # connect-int       10;
   # ping-int          10;
   # max-buffers     2048;
   # max-epoch-size  2048;
   # on-disconnect-reconnect;
  after-sb-0pri discard-younger-primary;
  after-sb-1pri consensus;
  after-sb-2pri disconnect;
  rr-conflict disconnect;
# allow-two-primaries;
 }
 syncer {
   rate 100M;
   al-extents 257;
 }
 on ha1 {
   device     /dev/drbd0;
   disk       /dev/sdb;
   address    192.168.0.1:7788;
   flexible-meta-disk  internal;
 }
 on ha2 {
   device     /dev/drbd0;
   disk       /dev/sdb;
   address    192.168.0.2:7788;
   flexible-meta-disk  internal;
 }
}
Hinweis

allow-two-primaries; sagt aus das zwei paralelle Zugriffe auf das DRBD Device möglich sind. Dabei schreiben die Nodes jeweils erstmal in ihre Metadata d.h. die Nodes haben auf ihren Bereich exclusiven Zugriff. Es ist nur eine erweiterte Option für ein aktive/aktive Setup.

DRDB Autostart

Muss nicht sein hat sich bei mir aber als gute brauchbare Lösung herausgestellt.

nano /etc/init.d/mountdrbd.sh

auf der 1. Node

#!/bin/bash
drbdadm primary web
mount /dev/drbd0 /pfad/zu/Mountpoint

auf der 2. Node

#!/bin/bash
drbdadm secondary web

Das ganze muss noch ausführbar gemacht werden und verlinkt werden nach:

sudo chmod +x /etc/init.d/mountdrbd.sh
sudo ln -s /etc/init.d/mountdrbd.sh /etc/rc2.d/S99mountdrbd.sh
Test DRBD

Nach einem Neustart kann man nun sehen ob die gemachten Einstellungen funktionieren.

cat /proc/drbd

sollte folgendes auf der Primären Node liefern:

version: 8.0.11 (api:86/proto:86)
GIT-hash: b3fe2bdfd3b9f7c2f923186883eb9e2a0d3a5b1b build by phil@mescal, 2008-02-12 11:56:43
0: cs:Connected st:Primary/Secundary ds:UpToDate/UpToDate C r---
   ns:257 nr:257 dw:515 dr:609 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
       resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0
       act_log: used:0/257 hits:27 misses:0 starving:0 dirty:0 changed:0

auf der Sekundären:

 

version: 8.0.11 (api:86/proto:86)
GIT-hash: b3fe2bdfd3b9f7c2f923186883eb9e2a0d3a5b1b build by phil@mescal, 2008-02-12 11:56:43
0: cs:Connected st:Secundary/Primary ds:UpToDate/UpToDate C r---
   ns:257 nr:257 dw:515 dr:609 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
       resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0
       act_log: used:0/257 hits:27 misses:0 starving:0 dirty:0 changed:0

Heartbeat

ha.cf
nano /etc/ha.d/ha.cf
logfile         /var/log/ha-log
logfacility     local0
udpport         694
keepalive       1
deadtime        10
warntime        5
initdead        15
bcast           eth0
#deadping       10
node            ha1 ha2
crm             off
#auto_failback  on
#respawn root   /usr/lib/heartbeat/ipfail

Autofailback also die Funktion das die Resourcen wieder auf die primäre Node “zurückwandern” scheint nicht zu funktionieren. Deswegen habe ich diese Funktion auskommentiert.

haresources
nano /etc/ha.d/haresources
  • 10.16.0.52 ist die IP des Clusters d.h die IP-Adresse unter der, der Apache Service zu erreichen ist.
  • ha1 ist eigentlich der Name der primären Node (für autofailback).
  • drbddisk::web ist das DRBD Device welches als Resource im Cluster benutzt wird.
  • hinter Filesystem steht das DRBD Device sowie dessen Mountpoint und die Art Filesystem
  • apache2 ist der Dienst der geclustert werden soll.

Auf beiden Nodes:

ha1     10.16.0.52      drbddisk::web Filesystem::/dev/drbd0::/home/data::xfs apache2
authkeys
nano /etc/ha.d/authkeys
auth 3
3 md5 dein-Super-geheimes-passwort

Die Datei authkeys braucht dann noch:

chmod 600 /etc/ha.d/authkeys

Test Gesamtkonfiguraton

Nun kann getestet werden mit:

/etc/init.d/heartbeat stop

Wenn man nun auf der anderen Node schaut:

ps -ef |grep apache

läuft der Apache nun hier.

www-data  6343  6342  0 14:00 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  6345  6342  0 14:00 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  6350  6342  0 14:00 ?        00:00:00 /usr/sbin/apache2 -k start
root      6459  5144  0 14:27 pts/0    00:00:00 grep apache

und die virtuelle IP-Adresse des Cluster befindet sich nun auf der zweiten Node.

ifconfig
eth0:0    Link encap:Ethernet  HWaddr 00:0c:29:11:b3:c6
          inet addr:10.16.0.52  Bcast:10.16.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:17 Base address:0x2000

Das nützt uns so aber noch nichts sondern wir wollen ja das Umswitchen der Nodes wenn z.B. auf einer das Netz also eth0 weg ist. Also auf der aktiven Node:

ifconfig eth0 down

und der Apache und die virtuelle Adresse ziehen um.

 

Crontab

User Crontab

auflisten des User Crontabs

crontab -l

min hour day month weekday   command
*   10   *   *     *        /etc/cron.d/backup

Ändern des User Crontabs

crontab -e

min hour day month weekday   command
*   10   *   *     *        /etc/cron.d/backup

Systemweiter Crontab

nano /etc/crontab

min hour day month weekday   user    command

17   *    *   *      *       root    cd / && run-parts --report /etc/cron.hourly
25   6    *   *      *       root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47   6    *   *      7       root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52   6    1   *      *       root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

 

Beispiele

Wenn man z.B ein Backup jeden Tag un 23.30 Uhr laufen lassen will sieht der Crontab so aus:

min hour day month weekday   command
30   23   *   *      *       /home/backup/tar-backup

30 steht für eine halbe Stunde

weiterlesen …

Mails von der bash senden

Einfache Emails von der bash aus schicken bzw. mittels shellscripts:

   $ mail root < /tmp/db_reorg.log
   $ echo "Komme zum Abendessen!" | mail sylvia@home.de
   $ echo "Heinz kommt auch mit" |
       mail -c johana -s "Aw:Komme zum Abendessen!" sylvia@home.de

Das Mail Kommendo akzeptiert die folgenden Parameter,

-s subject Betreff

-c address sendet eine Kopie der Email an Benutzer X

-b address sendet eine blind carbon copy der Email an Benutzer X

 

Datei Anhänge

uuencode

Binärdateien per Mail zu senden ist nicht sinnvoll, man könnte zwar eine Datei als Anhang so versenden,

mail -s "bild vom Abendessen" sylvia@home.de < essen.jpeg

aber die Wahrscheinlichkeit, dass diese unbrauchbar ankommt ist sehr hoch.
Beim versenden der Emails werden diese von einen Server zum nächsten gereicht. Jeder davon verändert die Email, d.h. entfernen von Null Bytes (ASCII code 0), umwandeln der end-of-line character LF (“line-feed”, ASCII code 12) in ein lokal passendes Format (e.g. CR LF), oder es werden anführende Leerzeichen und TABS entfernt.

Da nur sehr wenige Zeichen sicher nicht verändert werden, ist die traditionelle Lösung die Email vom Binärformat in ein Textformat für die sichere Übertragung umzuwandeln. Das Programm welches dafür benutzt wird heist uuencode (“UNIX to UNIX encoding”), zum decodieren der Emailheist das Programm uudecode.

 

$ uuencode essen.jpeg essen.jpeg | mail sylvia@home.de

Mit Text und Betreff:

$ (cat mailtext; uuencode essen.jpeg essen.jpeg) |mail -s "bild vom Abendessen" sylvia@home.de

ACHTUNG: Der Dateiname essen.jpeg erscheint zweimal in dem uuencode Befehl: der erse spezifiziert die Input Datei, die zweite ist für die Gegenseite.

mime

Vorteile:

  • vielseitige Dateimöglichkeiten, u.a. Bilder, Audio Dateien
  • mehr als ein Anhang pro Email
  • multi-part Nachrichten

Mutt ist ein interaktiver textbasierender Emailclient.

$ mutt -s "Geburtstags Feier" -a citymap.jpg all@freunde.de < einladung.txt
  • Den Empfänger (“all@freunde.de”)
  • Den Body der Email (gelesen von der Standard Eingabe, hier umgeleitet von der Datei “einladung.txt”)
  • Ein Anhang (mit Option -a)
  • Den Betreff (option -s)

Der interessanteste Teil ist die Option -a, welche für den Anhang verantwortlich ist. Die option -a kann mehrfach angehängt werden.

Wenn nur ein Anhang ohne Betreff gesendet werden soll kann man folgendermassen vorgehen:

$ mutt -a syslogs.tar.gz admin@domain.org < /dev/null

oder

$ echo | mutt -a syslogs.tar.gz admin@domain.org

Automatische Email Benachrichtigung für Updates auf Debian-Ubuntu

Installation

Dazu müssen wir folgende Schritte durchführen:

apt-get install apticron apt-listbug

apt-get install apticron apt-listbugs apt-listchanges

Nach der Installation konfigurieren wir apticron.

dpkg-reconfigure apticron

Hier geben wir einfach die Emailadresse an an welche wir die Update Benachrichtigung senden lassen wollen.

apticron

Testen

Zum Testen rufen wir einfach apticron in der Konsole auf.
MTA installiern konfigurieren

Bei der Installation der oben genanten Pakete wird auch das Paket mailx mit installiert. Wer z.B. Postfix lieber benutzten will installiert dies einfach nach.
apt-get install postfix
dpkg-reconfigure postf

apt-get install postfix

dpkg-reconfigure postfix

Wobei wir nun das Ganze als Satelitensystem konfigurieren. Mit der Option relay_host werden die Update Emails nun zu unserem Emailserver geschickt.
Die Email Benachrichtigungen sehen in etwas so aus:

apticron report [Wed, 03 Jun 2009 20:47:03 +0200]
========================================================================

apticron has detected that some packages need upgrading on:

localhost
[ 127.0.0.1 192.168.0.1 ]

The following packages are currently pending an upgrade:

cupsys 1.3.7-1ubuntu3.5
cupsys-bsd 1.3.7-1ubuntu3.5
cupsys-client 1.3.7-1ubuntu3.5
cupsys-common 1.3.7-1ubuntu3.5
libcupsimage2 1.3.7-1ubuntu3.5
libcupsys2 1.3.7-1ubuntu3.5

========================================================================

Package Details:

Lese Changelogs…
— Änderungen für cupsys (cupsys cupsys-bsd cupsys-client cupsys-common libcupsimage2 libcupsys2) —
cupsys (1.3.7-1ubuntu3.5) hardy-security; urgency=low

* SECURITY UPDATE: Remote denial-of-service via IPP_TAG_UNSUPPORTED tags.
– debian/patches/CVE-2009-0949.dpatch: make sure the name field exists
in scheduler/ipp.c.
– CVE-2009-0949

— Marc Deslauriers <marc.deslauriers@ubuntu.com> Mon, 01 Jun 2009 10:32:52 -0400

========================================================================

You can perform the upgrade by issuing the command:

aptitude dist-upgrade

as root on localhost

It is recommended that you simulate the upgrade first to confirm that
the actions that would be taken are reasonable. The upgrade may be
simulated by issuing the command:

aptitude -s -y dist-upgrade

apticron

Mit apticron haben wir nun ein vernünftiges Werkzeug um uns die tägliche Arbeit zu erleichtern, weil wir eben benachrichtigt werden wenn wichtige Updates anstehen

(m,a,c)time

mtime atim ctime Definition

  • mtime die Zeitangabe der letzten Modifikation
  • atime die Zeitangabe des letzten Zugrifes
  • ctime die Zeitangabe der letzten Änderung der Inode

mtime

Die mtime ist der Zeitpunkt zu dem die Datei oder das Verzeichniss zuletzt medifiziert wurde. Sie wird jedesmal vom Filessystem jedesmal updated, wenn etwas eine Änderung stattgefunden hat.

Um die mtime einer Datei anzuzeigen:

ls -l <filename>

atime

Die atime ist der Zeitpunkt an dem die Datei oder das Verzeichniss zuletzt aufgerufen wurde. Sie wird jedesmal aktualisiert, wenn eine Datei oder ein Verzeichniss mit einem Read oder Write Befehl aufgerufen wird.

Um die atime einer Datei anzuzeigen:

ls -lu <filename>

ctime

Die ctime ist der Zeitpunkt an dem die Datei oder das Verzeichniss zuletzt aufgerufen wurde und dabei die inode geändert wurde. Sie wird jedesmal aktualisiert, wenn eine Datei oder ein Verzeichniss mit einem permision, own, set link Befehl aufgerufen wird.

Um die ctime einer Datei anzuzeigen:

ls -lc <filename>

Mount.nfs: Stale NFS file handle

Um das Problem mit dem NFS Share zu beheben helfen folgende Schritte:

  • umount, remounten des Filesystems mit der Option -o

Aus der Man Page: -O Overlay mount. Allow the file system to be mounted over an existing mount point, making the underlying file system inaccessible. If a mount is attempted on a pre-existing mount point without setting this flag, the mount will fail,

             		 producing the error "device busy".

 

  • Killen oder Neustarten des NFS Prozesses
  • Einen neuen Mountpoint erstellen und das NFS Share dort einhängen
  • Client rebooten
  • umount -f /mount/point, danach remount

Prozesse killen mit xargs

Machmal ist es praktisch einen Prozess zu killen. Normalerweise sucht man dann die Prozess Id und setzt ein kill Prozessid bzw. kill -9 Prozessid ab.

Das geht aber wessentlich eleganter in einen Schritt mittels xarg und awk. Wollen wir z.B. denn SSH Daemon killen:

 #ps -ef |grep ssh| awk '{ print $2 }' |xargs kill -9
  • Mit ps -ef rufen wir die Prozessliste auf und filtern diese mittels grep nach ssh.
  • Das ganze wird über eine Pipe an awk übergeben, welches dann die zweite Spalte print $2 ausgibt.
  • Das Ergebniss sieht folgendermassen aus:

 

1519
10631
19829
19897
20030

Das wiederum übergeben wir an xargs kill -9. Xargs liest nun Zeile für Zeile aus und killt die entsprechenden Prozesse der Reihe nach.