Output loopen

Möchte man in einem shell script mit einer Ausgabe irgendwas machen, geht das ganz leicht mittels:

for line in `ls`; do echo "this is line: $line"; done

In diesem Beipsiel wird jede Zeile von "ls" wieder ausgegeben.
Selbiges könnte man zum Beispiel cat mit dem Inhalt einer Datei machen:

for line in `cat datei.txt`; do echo "this is line: $line"; done

Man kann auch ein kommando ausführen und dies erst in eien Variable schreiben.
Das folgende Beispiel findet alle ausführbaren .conf Dateien im Verzeichis /etc/myapp/ und führt diese mit dem entpsrechenden Benutzer der die Datei besitzt aus:

init_files=`find /etc/myapp/<em> -maxdepth 1 -type f -name </em>.conf -perm -u+rx`
for init_files in $init_files
  do
    script_owner=`stat -c '%U' $init_script`
    echo -e "nStarting script for user: $script_owner"
    sudo -u $script_owner -i $init_script $1;
    RETVAL=$(($RETVAL+$?))
  done

Umleitung auf www Domain

Hat man eine Webseite, sollte diese immer mit und ohne, dass „www“ erreichbar sein; d.h. http://example.com/ oder http://www.example.com.

Man sollte sich aber in einem solchen Fall für eine Schreibweise entscheiden und die andere auf diese umleiten um keine Probleme mit Cookies zu kriegen und die Suchmaschinen nicht zu verwirren.
Suchmaschinen-technisch ist dies auch schlecht, da die Suchmaschine dann denken, man mache dies extra um mehr hits zu bekommen und die Seite teilweise im ranking sogar herabstufen!

Achtung, benutze nur eine der folgenden Anweisungen in deinem .htaccess file:

Um alle User so umzuleiten, dass die Seite MIT dem „www.“ Präfix läuft, benutze diese Einstellung:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Um alle User so umzuleiten, dass die Seite OHNE dem „www.“ Präfix läuft, benutze diese Einstellung:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301]

Dies leitet nun alles was NICHT http://www.example.com/ ist nach http://www.example.com/ um. So lässt sich dies auch gut gebrauchen wenn man noch weitere domains hat, die auf dieses Verzeichnis zeigen und man alle zur gleichen Haut-Domain weiter leiten möchte. (:wink:)

[stextbox id=“tip“ caption=“Tip: Umleitung direkt in der Server-Konfiguration“]Manche CMS, wie z.B. Drupal ersetzen bei einem update meist die .htaccess Datei mit ihrer Standard-Datei. Dies führt dann dazu, dass man die eigenen Änderungen nach jedem update neu nachtragen muss, was sehr mühsam ist.

Hat man die Möglichkeit die Server-Konfiguration zu ändern, macht man die Umleitung deshalb am besten direkt im VirtualHost File:

  #[...]
 
 
    RewriteEngine on
    RewriteCond %{HTTP_HOST} !^www. [NC]
    RewriteRule ^ <a href="http://www.%{HTTP_HOST}%{REQUEST_URI}" target="blank" rel="noopener noreferrer">http://www.%{HTTP_HOST}%{REQUEST_URI}</a> [L,R=301]
 
 
  #[...]

Quelle: http://drupal.stackexchange.com/questions/30167/htaccess-www-redirect-in-dev-desktop|drupal.stackexchange.com
[/stextbox]

Drupal: Suchindex lässt sich nicht mehr neu erstellen

Falls es vorkommen sollte, dass bei drupal die Neuerstellung des Suchindexes fehl schlägt und der entsprechende cronjob "search_cron" in einen HTTP 500 error läuft müssen alle Module deaktiviert und dann der Index neu erstellt werden.

Dies geht am besten auf der shell mit den Modulen [http://drupal.org/project/drush|drush] und [http://drupal.org/project/reindex|reindex]:

[mysite.tld@server public_html]$ drush vset site_offline 1
[mysite.tld@server public_html]$ DRUPAL_MODULES=$(drush pm-list --status="enabled" --type="module" --no-core --pipe | tr 'n' ' ')
[mysite.tld@server public_html]$ drush pm-disable $DRUPAL_MODULES
[mysite.tld@server public_html]$ drush cache-clear all
[mysite.tld@server public_html]$ drush pm-enable reindex

Nun wechselt man zur Seite und startet die Neuerstellung des indexes mit dem Modul reindex.

[mysite.tld@server public_html]$ drush pm-enable $DRUPAL_MODULES
[mysite.tld@server public_html]$ drush cache-clear all
[mysite.tld@server public_html]$ drush vset site_offline 0

Nach dieser Aktion kann man den search_cron wieder aktivieren.

Infos: drupal.org: [http://drupal.org/node/1192086|Re-Index crashes with Segmentation fault]

CentOS 5: postfix mit mysql Unterstützung

Am Anfang war der Workaround …

…welcome to the real world, admin! 😉

Leider hat das postfix-Paket im CentOS 5 (Ab CentOS 6 ist das behoben!) Standard Repository die mysql-Unterstützung nicht einkompiliert, welche man oft dringend braucht. Glücklicherweise ist diese im CentOS Plus Repository vorhanden, welches man nur noch einzurichten braucht. ABER VORSICHT: Es muss dann sichergestellt werden, dass postfix niemals mehr vom Base-Repository updatet wird, da ansonsten die mysql-Unterstützung wieder fehlt. Wir werden das hier so Einrichten.

Zuerst mal müssen wir schauen, dass in der Datei "/etc/yum.repos.d/CentOS-Base.repo"

der Eintrag für das CentOSPlus repository vorhanden und aktiviert ist; wenn nicht einfach einfügen, bzw. enabled=1 setzen. Ausserdem darauf schauen, dass unter jedem repository der Eintrag:

exclude=postfix<em>

vorhanden ist, AUSSER bei [centosplus] wo das stehen muss:

includepkgs=postfix</em>

Die Datei: /etc/yum.repos.d/CentOS-Base.repo müsste also etwa so aussehen:

[base]
name=CentOS-$releasever - Base
mirrorlist=<a href="http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os" target="blank">http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os</a>
#baseurl=<a href="http://mirror.centos.org/centos/$releasever/os/$basearch/" target="blank">http://mirror.centos.org/centos/$releasever/os/$basearch/</a>
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
exclude=postfix*
 
#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=<a href="http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates" target="blank">http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates</a>
#baseurl=<a href="http://mirror.centos.org/centos/$releasever/updates/$basearch/" target="blank">http://mirror.centos.org/centos/$releasever/updates/$basearch/</a>
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
exclude=postfix*
 
#packages used/produced in the build but not released
[addons]
name=CentOS-$releasever - Addons
mirrorlist=<a href="http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=addons" target="blank">http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=addons</a>
#baseurl=<a href="http://mirror.centos.org/centos/$releasever/addons/$basearch/" target="blank">http://mirror.centos.org/centos/$releasever/addons/$basearch/</a>
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
exclude=postfix*
 
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=<a href="http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras" target="blank">http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras</a>
#baseurl=<a href="http://mirror.centos.org/centos/$releasever/extras/$basearch/" target="blank">http://mirror.centos.org/centos/$releasever/extras/$basearch/</a>
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
exclude=postfix*
 
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=<a href="http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus" target="blank">http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus</a>
#baseurl=<a href="http://mirror.centos.org/centos/$releasever/centosplus/$basearch/" target="blank">http://mirror.centos.org/centos/$releasever/centosplus/$basearch/</a>
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
includepkgs=postfix*
 
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
mirrorlist=<a href="http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib" target="blank">http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib</a>
#baseurl=<a href="http://mirror.centos.org/centos/$releasever/contrib/$basearch/" target="blank">http://mirror.centos.org/centos/$releasever/contrib/$basearch/</a>
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
exclude=postfix*

HTML-Floatingbar

Mithilfe von wenigen Zeilen HTML und CSS stylinh ist es möglich so eine „Warnleiste“ zu kreieren, wie sie häufig von den Browsern verwednet wrid.

Dies kann man dann z.B. benutzen um den Besuchen Hinweise sich zu registrieren zu gaben. 🙂

Im ersten Schritt wird hier ein DIV Block angelegt, der dann mit CSS entsprechend formattiert wird:

<div class="floatingbar">
  <a href="/register.php" id="floatingbar"><img src="logo.gif" width="16" height="16" border="0" align="absmiddle">Registriere dich hier, um versteckte Bereiche sehen zu können!</a>
</div><br />
 
<style type="text/css">
.floatingbar a:hover, a:hover#floatingbar
{
  background-color: #45484F;
  color:#ffffff;
}
.floatingbar a, .floatingbar a:link
{
  background-color: #F1EEC8;
  color:black;
  position:fixed;
  padding:5px 10px;
  display:block;
  top:0;
  left:0;z-index:100;
  width:100%;
  border-bottom:2px solid gray;
  font-size:11px;
  font-family:Tahoma;
  margin:0;
  text-decoration:none;
}
</style>

Und das ganze sieht dann so aus:

html-floatingbar-01

 

Linux: Der Unterschied zwischen /usr/local und /opt

Wenn man intensiv mit Linux arbeitet, wird man sich irgendwann mal fragen was der Unterschied zwischen den Verzeichnissen /usr/local und /opt ist – Denn gemäss dem Filesystem Hierarchy Standard (FHS) sind beide Verzeichnisse für „lokale Software Installationen“ zu verwenden. Doch welches Verzeichnis ist wann angebracht? Und Warum gibt es überhaupt zwei verschiedene Verzeichnisse? Dieser Artikel soll darüber Auskunft geben.

Warum gibt es zwei „konkurrierende“ Verzeichnisse?

Nun, dafür gibt es mehrere Gründe und die Systemadministratoren streiten sich nunmehr schon seit über 20 Jahren darum. 😉

Einer davon ist sicher, dass das Linux nicht „von Grund auf“ designet, worden, sondern gewachsen ist. So haben die einen Leute ihre lokale Software in /usr/local installiert, andere hingegen in /opt.

Ein anderer Grund ist, dass das /usr Verzeichnis ursprünglich mal dazu gedacht war über das Netzwerk auf mehreren Rechnern geteilt zu werden (was jedoch praktisch nie so gehandhabt wurde) und so wäre /usr/local häufig auch nicht „lokal“ gewesen. So hatte man dann Software, die allen Servern zur Verfügung stehen sollten in /usr/local installiert und tatsächlich „lokale Software“ in /opt

Weiter wurde einmal definiert, dass man das /usr filesystem read-only mounten können muss. So wäre dann aber /usr/local ebenfalls nicht beschreibbar gewesen und /opt wäre hierzu wieder die Lösung gewesen.

Doch, wann ist welches der beiden Verzeichnisse zu verwenden?

Heutzutage, wo das /usr filesystem weder mit anderen Rechnern geteilt- noch read-only gemounted wird, gibt es trotzdem noch einen Grund zwischen /usr/local und /opt zu Unterscheiden: Denn /usr/local ist ein „Abbild“ von /usr, mit all seinen Unterverzeichnissen wie /bin /lib, /src, /etc,…

So verwendet man /usr/local für Programme, die sich exakt an den Linux filesystem Standard halten, also etwa librairies in /usr/local/lib ablegen, ausführbare Dateien ind /usr/local/bin, Dokumentationen (natürlich im man-page Format) in /usr/local/share/man, usw.

Das /opt Verzeichnis hingegen benutzt man bei Software die diesen Standard nicht einhält, bzw. nicht einhalten kann, weil sie Plattform-Unabhängig geschrieben ist. Dort würde man dann die Programmbibliotheken, Ausführbare Dateien, Dokumentation, usw. alles im Programm Verzeichnis vorfinden, also z.B. /opt/myAPP/bin, /opt/myAPP/config, /opt/myAPP/librariers, usw.

Ersteres (hält den Standard nicht ein) trifft oft bei sog. „Windows Style“ Programmen zu, die ihre Dateien z.B. alle unter C:Programme ablegen würden.

Zweiteres trifft dann z.B. bei Java Software zu, da in Java geschriebene Programme meist schon „von Haus aus“ Plattform unabhängig sind und so auch auf mehreren Systemen installiert werden können. – So findet man beispielsweise die Java Installation oft unter /opt/java, anstatt im /usr Verzeichnis verteilt und auch darauf basierende Software, wie z.B. der JBOSS Applikationsserver wird besser in /opt/jboss installiert, anstatt in /usr/local.

Gibt es noch andere solche Fälle?

Es gibt tatsächlich noch solche Inkonsistenzen, die historisch heran gewachsen ist, z.B. die Verwendung von /var anstatt /srv für sich ändernde Daten von Programmen.
Hier wird leider der apache Webserver auf den meisten Installationen unter /var/www, anstatt /srv/www abgelegt. Dies ist jedoch vor allem heute, wo ein Webserver viel mehr als 2-3 Seiten zur Verfügung stellt nicht hinnehmbar und man sollte notfalls das Verzeichnis /var/www auf /srv/www verlinken und für reine „Hosting Webserver“ am besten gleich /home dafür nehmen.

Quellen

Filesystem Hierarchy Standard
Linux Journal: Point/Counterpoint – /opt vs. /usr/local
unix.com: Difference between /opt and /usr/local
unix.stackexchange.com: What is the difference between /opt and /usr/local?
Google Suche zum Thema

Suchen und Ersetzen in Variablen

In einem anderen KB-Eintrag ging es um das suchen & ersetzen von strings in Dateien. Dies geht jedoch auch in Variablen:

Will man Beispielsweise in der folgenden variable:

VAR1=“Ich fahre Velo“

Den Text „Velo“ mit „Auto“ ersetzen geht dies wie folgt:

VAR2=${VAR1//Velo/Auto}

Quellen

unix.com: search & replace in variable

Mit lsof Speicherplatz von gelöschten offenen Dateien finden & freigeben

Bei Linux kann es manchmal zum Phänomen kommen, dass viel Speicherplatz verbraucht wird, aber tatsächlich gar nicht so viel auf der Disk vorhanden scheint, wenn man alle Files zusammen zählt:

[root@host ~]# df -h /usr/
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              22G   20G  357M  99% /usr
 
[root@host ~]# du -sh /usr/
<ol>
12G     /usr/
</ol>

In diesem Beispiel wird mit df auf /usr ein Speicherplatzverbrauch von 20GB angezeigt; tatsächlich sind aber nur 12GB mit Dateien belegt, wenn man diese mit du zusammen zählt. – Wo sind also die restlichen 8GB?

Grund dafür ist, wenn man einem Prozess, der gerade eine Datei schreibt, ihm diese Datei löscht. So wird der Prozess nicht benachrichtigt, dass die Datei nicht mehr im Filesystem ist und er schreibt weiterhin auf die Festplatte, resp. in das sog. "File Handle" wie das ein Programmierer ausdrücken würde.

Solche Prozesse, die gelöschte Dateien noch offen haben, findet man mit dem lsof Kommando:

[root@host ~]# lsof -a +L1
COMMAND  PID   USER   FD   TYPE DEVICE       SIZE NLINK    NODE NAME
perl    5844 oracle    5w   REG    8,3    4194360     0 1337313 /usr/local/myapp.log (deleted)

Startet man dann den entsprechenden Prozess neu, wird der Platz wieder frei gegeben.

[stextbox id=“note“ caption=“Hinweis“]Grundsätzlich sollte man, wenn man files löscht, sicherstellen, dass diese nicht gerade beschrieben werden (gilt besonders für logfiles).

So sollte man bei "aktiven" Dateien am besten vorher den Prozess beenden, der darauf schreibt, oder nach dem löschen diesen neu starten.[/stextbox]

Quellen

http://www.jfranken.de/homepages/johannes/vortraege/lsof_inhalt.de.html

drupal: Alle Benutzer zu einem simplenews Newsletter anmelden

Wenn man Drupal mit bereits einigen usern hat und dann simplenews installiert, will man warhscheinlich alle user zu einem erstellten newsletter hinzufügen.

Dies geht ganz einfach mit zwei SQL kommandos:

INSERT INTO drupal_simplenews_subscriptions(activated,mail,uid) SELECT 1,mail,uid FROM drupal_users WHERE uid > 0 ORDER BY uid ASC;
INSERT INTO drupal_simplenews_snid_tid(snid,tid) SELECT snid,1 FROM drupal_simplenews_subscriptions;

Wobei in diesem Code "1" jeweils die ID des Newsletters ist (muss evtl. angepasst werden!).

Quellen

http://cc.com.au/2010/02/03/drupal-simplenews-mass-subscribe
http://stackoverflow.com/questions/4738403/drupal-simplenews-how-to-subscribe-all-existing-users