halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Das klappt schon mal super ... Danke dafür! Ich muss es jetzt erstmal in Ruhe durchgehen, damit ich auch verstehe was wie abläuft. Des Weiteren will ich mir noch die Erweiterung basteln, das tail-output-file (in dem Fall /home/pflog2) per Parameter (arg $1) beim Start mitzugeben.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
vi /usr/local/bin/my_tcp_dump
1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/sh
set -m
# Auftragssteuerung aktivieren; Prozess in separaten Prozessgruppe
trap 'kill %%' INT TERM EXIT
# Skript reagiert auf Signal - abfangen von kill <PROZESS> und beenden des Daemon
tail -c +1 -f /var/log/pflog | tcpdump -lnetttr - >> /home/pflog2 2> /dev/null &
# Anfügen des Ergebnisses von tail | tcpdump an Datei; Umleitung des Standard-Fehlerkanals ins "Nichts"; Prozess im Hintergrund starten
wait
# Anhalten des Skript (Subshell) bis zur Beendigung des zuletzt gestarteten Hintergrund-Jobs
|
vi /etc/rc.d/my_tcp_dump
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | #!/bin/ksh
daemon="/usr/local/bin/my_tcp_dump"
# Pfad der Daemondatei definieren
. /etc/rc.d/rc.subr
# Standartfunktionen und -variablen
rc_bg=YES
# Daemon im Hintergrund starten
rc_reload=NO
# Reload der Konfiguration nicht möglich
pexp='/bin/sh /usr/local/bin/my_tcp_dump'
# Ausdruck für pgrep um Prozess zu finden und/oder pkill um Prozess zu killen
rc_cmd $1
# Verhalten steuern (start, stop)
|
Habe ich es so treffend formuliert oder sind Verständnisfehler enthalten???
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
Mir sind da zwei kleinere Dinge aufgefallen: halloICKEbins schrieb: . /etc/rc.d/rc.subr # Standartfunktionen und -variablen
https://www.duden.de/haeufige_fehler/Standart
rc_reload=NO # Reload der Konfiguration nicht möglich
Genauer gesagt: das ausgeführte Programm bietet keine Möglichkeit auf ein SIGHUP Signal zu reagieren, daher macht es keinen Sinn eines zu senden.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Habe mich gerade Mal an der Umsetzung mittels Parameterübergabe versucht aber ist doch nicht so einfach wie ich dachte. Wollte im /usr/local/bin/my_tcp_dump mittels Variable im Pfad(/home/pflog2) den Dämon starten...aber nimmt mein Parameter nicht. # /etc/rc.d/my_tcp_dump /home/pflog2 start Ziel ist außerdem, dass ich den Daemon mit mehreren "Pfaden" gleichzeitig starten kann!
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
Du musst dem Skript /etc/rc.d/my_tcp_dump halt sagen, was es mit dem ersten und dem zweiten Argument anfangen soll und das gewünschte Argument in die daemon_flags und den pexp String packen, damit er alles nötige findet. Dann kannst du das Skript /usr/local/bin/my_tcp_dump das erste übergebene Argument als Pfad für tail nutzen lassen.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Leider bekomme ich mein arg ${1} nicht übergeben und weiß aber auch nicht wo mein Fehler ist! Kann ich ${1} so überhaupt in /usr/local/bin/my_tcp_dump nutzen? vi /etc/rc.d/my_tcp_dump
1
2
3
4
5
6
7
8
9
10
11
12 | #!/bin/ksh
daemon="/usr/local/bin/my_tcp_dump"
daemon_flags="${1}"
. /etc/rc.d/rc.subr
rc_bg=YES
rc_reload=NO
pexp='/bin/sh ${daemon} ${daemon_flags}'
rc_cmd $1
|
vi /usr/local/bin/my_tcp_dump
| #!/bin/sh
set -m
trap 'kill %%' INT TERM EXIT
tail -c +1 -f /var/log/pflog | tcpdump -lnetttr - >> ${1} 2> /dev/null &
wait
|
BSD# /etc/rc.d/my_tcp_dump /home/pflog2 start
usage: /etc/rc.d/my_tcp_dump [-df] start|stop|restart|check
BSD# /etc/rc.d/my_tcp_dump start /home/pflog2
my_tcp_dump(ok)
Beim Letzteren startet zwar der Daemon aber ich vermute ohne das Argument - ich habe keinen Eintrag in ps aux!
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
Schau dir mal an, wofür die /etc/rc.d/my_tcp_dump das erste Argument nutzt (letzte Zeile)... Außerdem musst du den String für pexp mit doppelten Anführungszeichen quoten, wenn du eine Variablenersetzung erlauben willst: 1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/ksh
#
daemon="/usr/local/bin/my_tcp_dump"
daemon_flags="$2"
. /etc/rc.d/rc.subr
rc_bg=YES
rc_reload=NO
pexp="/bin/sh ${daemon}${daemon_flags}"
rc_cmd $1
|
| #!/bin/sh
set -m
trap 'kill %%' INT TERM EXIT
tail -c +1 -f /var/log/pflog | tcpdump -lnetttr - >> "$1" 2> /dev/null &
wait
|
Damit sollte es klappen:
# /etc/rc.d/my_tcp_dump start /tmp/foo.log
my_tcp_dump(ok)
# /etc/rc.d/my_tcp_dump check /tmp/foo.log
my_tcp_dump(ok)
# ps aux | grep my_tcp_dump
root 11812 0.0 0.1 864 832 p0 Sp 10:35AM 0:00.01 /bin/sh /usr/local/bin/my_tcp_dump /tmp/foo.log
root 60332 0.0 0.0 128 292 p0 R+/0 10:35AM 0:00.00 grep my_tcp_dump
# /etc/rc.d/my_tcp_dump stop /tmp/foo.log
my_tcp_dump(ok)
# ps aux | grep my_tcp_dump
root 56015 0.0 0.0 196 364 p0 R+/0 10:35AM 0:00.00 grep my_tcp_dump
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Bei mir geht es nicht! | BSD# /etc/rc.d/my_tcp_dump start /tmp/foo.log
my_tcp_dump(ok)
BSD# /etc/rc.d/my_tcp_dump check /tmp/foo.log
my_tcp_dump(failed)
|
Am Rande: Welche Codeblock muss ich nehmen, damit er wie bei dir auch schwarz ist?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
halloICKEbins schrieb: Bei mir geht es nicht!
Ich fürchte da ist mir ein Leerzeichen verloren gegangen, die Zeile für pexp muss so aussehen:
pexp="/bin/sh ${daemon} ${daemon_flags}"
Am Rande: Welche Codeblock muss ich nehmen, damit er wie bei dir auch schwarz ist?
{{{#!vorlage befehl
# hier steht ein cooler Shell Befehl
}}}
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Daran liegt es nicht. Das Leerzeichen hatte ich selber schon entfernt. Funktioniert dein geschickter Code so bei dir oder hast du ihn fürs Forum nochmals runtergeschrieben? Kann ich noch irgendwo anders schauen (log usw.) woran es liegt?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
halloICKEbins schrieb: Daran liegt es nicht. Das Leerzeichen hatte ich selber schon entfernt.
Das muss aber drin sein... Funktioniert dein geschickter Code so bei dir oder hast du ihn fürs Forum nochmals runtergeschrieben?
Ich habe es gerade noch mal frisch aus der VM geholt, wo es funktioniert:
1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/ksh
#
daemon="/usr/local/bin/my_tcp_dump"
daemon_flags="$2"
. /etc/rc.d/rc.subr
rc_bg=YES
rc_reload=NO
pexp="/bin/sh ${daemon} ${daemon_flags}"
rc_cmd $1
|
Ich hatte überlegt einen Default-Wert für die Logdatei vorzugeben, damit das Skript auch funktioniert, wenn man keine Datei im zweiten Argument beim Start angibt und da die falsche Version beim Kopieren erwischt... Kann ich noch irgendwo anders schauen (log usw.) woran es liegt?
Wenn der check-Befehl fehlschlägt, findet der pgrep-Befehl aus der /etc/rc.d/rc.subr den Prozess anhand des pexp-Musters nicht. Der Nachteil des Ansatzes beim Init-System von BSD ist, dass man sich leicht vom init-System nicht mehr kontrollierbare Prozesse einfangen kann (müsste man mit ps aux sehen können), wenn die Start- und Stop-Skripte nicht richtig arbeiten - bei Systemd unter Linux kann man im Zweifelsfall einfach die komplette cgroup abräumen.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
seahawk1986 schrieb: halloICKEbins schrieb: Daran liegt es nicht. Das Leerzeichen hatte ich selber schon entfernt.
Das muss aber drin sein...
Sorry...habe das Richtige gedacht aber das Falsche geschrieben... Ich meinte natürlich, dass ich das Leerzeichen dazwischen gesetzt habe! Kann mir leider nicht erklären, woran es jetzt liegt...ich benutze Version 6.5 - was aber ja hoffentlich kein Unterschied macht!
Wenn der check-Befehl fehlschlägt, findet der pgrep-Befehl aus der /etc/rc.d/rc.subr den Prozess anhand des pexp-Musters nicht.
Richtig...per ps aux sehe ich keinen Prozess.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Habe die Lösung! Neustart 😉 keine Ahnung was mit meinem System los war... unlogisch aber hat geklappt! Noch ne andere Frage: Wenn ich jetzt mein Daemon mit unterschiedlichen Pfaden gleichzeitig laufen lassen möchte, dann habe ich jetzt einen logischen Softlink erstellt und starte diesen damit: BSD# /etc/rc.d/my_tcp_dump start /tmp/foo.log
BSD# ln -s /etc/rc.d/my_tcp_dump /etc/rc.d/my_tcp_dump_2
BSD# /etc/rc.d/my_tcp_dump_2 start /tmp/foo2.log Jetzt müsste ich ja bei 10 zusätzlichen Instanzen 10 logische Links erstellen! Gibt es hierfür einen eleganteren Weg?
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Jetzt müsste ich ja bei 10 zusätzlichen Instanzen 10 logische Links erstellen! Gibt es hierfür einen eleganteren Weg?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
Die Frage wäre in einem OpenBSD-Forum vermutlich besser aufgehoben - ich habe bei einer Suche nichts in der Richtung gefunden, dass rc.d Instanzen von Services (wie es z.B. sytemd unter Linux kann) unterstützt. Kannst du mal den Anwendungsfall dafür beschreiben? Statt sich x-mal mit tail an die selbe Datei zu hängen, könnte man ja z.B. auch mit tee und FIFOs/named pipes arbeiten.
|