Konvertieren des Überwachungsbefehls in ein Einheitendateisystem


1

Ich habe ein Shell-Skript wie folgt

ss.sh

#!/bin/bash
opFile="custom.data"
sourceFile="TestOutput"
./fc app test > $sourceFile
grep -oP '[0-9.]+(?=%)|[0-9.]+(?=[A-Z]+ of)' "$sourceFile" | tr '\n' ',' > $opFile
sed -i 's/,$//' $opFile

Voraussetzung ist, dass ich dieses Skript mit dem Befehl watch verwenden muss. Und ich möchte daraus einen System-Service machen. Ich habe es so gemacht.

sc.sh

#!/bin/bash
watch -n 60 /root/ss.sh

Und in meiner / etc / systemd / system,

log_info.service

[Unit]

Description="Test Desc"
After=network.target

[Service]
ExecStart=/root/sc.sh
Type=simple

[Install]
WantedBy=default.target

Wenn ich systemctl start log_info.service starte, läuft es aber nicht kontinuierlich so, wie ich es gerne hätte.

Beim Ausführen von sytemctl status log_info.service

info_log.service - "Test Desc"
   Loaded: loaded (/etc/systemd/system/info_log.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2016-09-12 08:17:02 UTC; 2min 18s ago
  Process: 35555 ExecStart=/root/sc.sh (code=exited, status=1/FAILURE)
 Main PID: 35555 (code=exited, status=1/FAILURE)

Sep 12 08:17:02 mo-b428aa6b4 systemd[1]: Started "Test Desc".
Sep 12 08:17:02 mo-b428aa6b4 sc.sh[35654]: Error opening terminal: unknown.
Sep 12 08:17:02 mo-b428aa6b4 systemd[1]: info_log.service: Main process exited, code=exited, status=1/FAILURE
Sep 12 08:17:02 mo-b428aa6b4 systemd[1]: info_log.service: Unit entered failed state.
Sep 12 08:17:02 mo-b428aa6b4 systemd[1]: info_log.service: Failed with result 'exit-code'.

Irgendwelche Ideen, warum es nicht richtig läuft? Jede Hilfe wäre dankbar!


der Schlüssel ist Error opening terminal: unknown. watch muss auf ein Terminal schreiben, aber Dienste haben keinen Zugriff auf eines. Warum soll dies eine Dienstleistung sein?
Eric Renouf

Ah. Wie interessant. Da dieses Skript im Vordergrund ausgeführt wird, wird diese Terminalsitzung belegt. Was würden Sie sonst noch vorschlagen? Hintergrund?
Izy-

Wenn Sie nicht möchten, dass es das Terminal belegt, würde ich empfehlen, entweder nicht zu verwenden watch oder läuft sowas screen oder tmux Sie können also ein Fenster haben, in dem das ausgeführt wird, und andere, in denen Sie andere Arbeiten ausführen. Bonus: Sie können sich wieder mit denselben Terminals verbinden, wenn Sie sich remote anmelden, und die Dinge, die Sie tun, überleben eine SSH-Trennung
Eric Renouf

Dies geschieht alles aus der Ferne. Das Ausführen beider Skripte erfolgt ausschließlich auf einem Remote-System. Womit ich nicht wirklich berechtigt bin, Anwendungen von Drittanbietern zu installieren. Und um das Laufen zu vereinfachen, wollten wir, dass es ein systemctl-Aufruf ist. Irgendwelche anderen Ideen, Sir?
Izy-

Bist du sicher screen und tmux sind nicht verfügbar? Sie können schon da sein. Andernfalls würde ich wahrscheinlich entweder 2 Fenster öffnen, wenn ich das die ganze Zeit haben wollte, oder es nur episodisch ausführen.
Eric Renouf

Antworten:


1

Wie die Fehlermeldung zeigt, watch Kann nur von einem Terminal aus verwendet werden:

Error opening terminal: unknown

Aber Ihre Anforderung ist sehr wahrscheinlich ist nicht um das Skript mit zu verwenden watch. Ihre Anforderung ist zu lassen sie es alle 60 sekunden laufen, und watch ist das Werkzeug, für das Sie sich letztendlich entschieden haben.

Die gebräuchlichste Methode, ein Skript alle 60 Sekunden auszuführen, wäre cron - z.B. ein * * * * * Cronjob würde jede Minute ausgeführt werden. Mit systemd .services können Sie eine .timer-Einheit für denselben Zweck verwenden:

# foo.timer
[Unit]
Description=Do whatever

[Timer]
OnActiveSec=60
OnUnitActiveSec=60

[Install]
WantedBy=timers.target

Anstatt den .service zu starten, starten Sie stattdessen den .timer, und er versucht regelmäßig, den .service von selbst zu starten.


Ah, ich hatte mir das Skript nicht genau genug angesehen, um zu erkennen, dass es nur darum ging, eine Datei zu ändern und keine Ausgabe anzuzeigen (auf die ich verzichtet habe). Dies ist mit Sicherheit der Weg in die Zukunft, anstatt ihn mit dem Terminal zu fälschen, wie ich es in den Kommentaren besprochen hatte.
Eric Renouf

Vielen Dank für Ihre Hilfe. In Bezug auf diese Lösung, könnten Sie mich bitte noch einmal durch die Prozedur führen, ich bin neu bei systemd services. Diese foo.timer-Datei, die Sie erstellt haben, muss alle 60 Sekunden ausgeführt werden. Aber ist es immer noch eine Unit-Datei für systemd? Wo ruft diese Datei mein ss.sh-Skript auf, das ich alle 60 Sekunden ausführen muss?
Izy-

Es ist eine Unit-Datei für systemd. Es ruft Ihr Skript nicht auf. Es startet immer wieder das entsprechende .service, welche dann ruft dein script auf.
grawity

Also muss meine anfängliche log_info.service-Datei dann noch existieren? Und ich verstehe immer noch nicht, wo dieser foo.timer meine andere log_info-Servicedatei aufruft, wenn das der Fall ist
Izy-

Wenn sich die Namen unterscheiden, geben Sie den Namen der Serviceeinheit in an [Timer] Unit=. Andernfalls foo.timer werde versuchen zu suchen foo.service standardmäßig.
grawity
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.