[PYTHON] Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert

Annahme

Das Arbeitsterminal ist Windows. Es gibt Dutzende von Unix-Servern für Betrieb / Wartung. Der Zweck besteht darin, die erforderlichen Daten im CSV-Format auf diesem Unix-basierten Server zu generieren und unter Windows zu komprimieren. Die folgenden Sprachen sind ksh93 und Python

Die Situation zu dieser Zeit

Ich habe mich bei jedem Server angemeldet, einen Befehl eingegeben und Daten als Text genommen. Es kann keine solche Ineffizienz geben. Ich werde es verbessern!

Verbesserung

Erster zug

Verteilen Sie ein Skript (im Folgenden: moge.sh), das die erforderlichen Daten auf jedem Unix-Server in CSV konvertiert. Dies verkürzt es auf einige Minuten pro Einheit. Nachdem Sie das Skript auf Dutzenden von Einheiten ausgeführt haben, rufen Sie es mit Filezilla usw. ab. Dann verrückt nach Windows. Immer noch mühsam.

2. Zug

Machen wir es möglich, Skripte auf allen Servern auf einem Server zu starten und sie dann zu kopieren. So was

kicker.ksh


cat servers.list | while read HOST ; do
    ssh ${HOST} -n /hoge/moge.sh
    scp ${HOST}:/hoge/moge.csv ./data/${HOST}.csv
done

Wenn Sie fertig sind, rufen Sie alle CSVs mit Filezilla usw. von einem ab. Aber ** seriell **, also dauert es ** 1 Stunde **, um das Skript fertig zu stellen.

3. Zug

Da ssh langsam ist, sollten Sie dies in den Hintergrund stellen. Deshalb sieht es so aus

kicker2.ksh


cat servers.list | while read HOST ; do
    ssh ${HOST} /hoge/moge.sh &
    PID[${HOST}]=$!
done

while [[ ${#PID[*]} -ne 0 ]] ; do
    for HOST in ${!PID[*]} ; do
        if ! ps -ef | grep -w ${PID[${HOST}]} ; then
            scp ${HOST}:/hoge/moge.csv ./data/${HOST}.csv
            unset PID[${LPAR}]
        fi
    done
    sleep 1
done

Es dauerte nur ein paar Minuten, aber schließlich waren Filezilla-ähnliche Dinge von Windows problematisch.

4. Zug

Die Sprache wurde gewählt, weil Python, das Excel erstellen kann, praktisch ist, um CSV durcheinander zu bringen.

kicker3.py



with open("server.lst", "r", encoding='shift-jis') as fd:
    for host in fd:
        proc = subprocess.Popen(["ssh", host, "/hoge/moge.sh"], stdout=DEVNULL, stderr=DEVNULL)
        proclist[proc.pid] = proc

while proclist:
    for pid in list(proclist):
        if proclist[pid].poll() is not None:
            del proc[pid]
            subprocess.Popen(["scp", host + ":/hoge/moge.csv", "./" + host + ".csv"], stdout=DEVNULL, stderr=DEVNULL)
    sleep(1)

Es funktioniert mit WSL, aber ** stoppt in der Mitte ** für Eingabeaufforderungen. Dies funktioniert, wenn Sie den Inhalt von server.list reduzieren (bis zu 5 bis 6). Warum?

4. Zug Erweiterung

Ich habe es überhaupt nicht verstanden, daher ist es vorerst besser, es asynchron mit asyncio of Python auszuführen. Es kann gut sein. Also habe ich angefangen zu recherchieren. Nach vielen Drehungen und Wendungen sieht es so aus.

kicker4.py


async def _run(host):
    ssh = "ssh %s /hoge/moge.sh" % host
    p = await asyncio.create_subprocess_exec(ssh, stdout=DEVNULL, stderr=DEVNULL)
    await p.wait()
    scp = ["scp", host + ":/hoge/moge.csv", "./" + host + "%s.csv"]
    p = subprocess.run(scp, stdoutDEVNULL, stderr=DEVNULL)

loop = asyncio.ProactorEventLoop()
asyncio.set_event_loop(loop)

with open("server.lst", "r", encoding='shift-jis') as fd:
    funcs = asyncio.gather(*[_run(host) for host in fd])

loop.run_until_complete(funcs)

Das funktioniert auch nicht. Die Veranstaltung ändert sich überhaupt nicht. Was mir hier aufgefallen ist. ** Bewegen Sie sich, wenn Sie * Enter * drücken, wenn Sie anhalten **. Warum? Gibt es ein Problem mit der Standardeingabe?

Lösung

Die richtige Antwort wird im ersten ksh-Skript geschrieben. Dies liegt an der Option ** "-n" ** von ssh. In ksh stehen read und ssh in Konflikt mit der Standardeingabe, daher dachte ich, dass "-n" notwendig ist Ich habe es von Anfang an getragen. Python hat jedoch eine andere Standardeingabe als ssh. Es scheint, dass das Vorurteil, dass es in Ordnung war, nichts zu tun, ein Problem war. Es scheint, dass die Standardeingabe gesteuert werden muss, wenn mehrere ssh im Hintergrund gestartet werden. (stdin = subprocess.DEVNULL war nutzlos) Es ist immer noch ein Rätsel, dass es mit WSL funktioniert hat, aber ich werde es nicht untersuchen, weil ich es nicht mehr benutze.

Warum ich WSL nicht mehr benutze

In meinem Python-Skript verwende ich auch openpyxl für Gonyo Gonyo unter Windows. Wenn dies auf WSL ist, frisst es manchmal BSOD, so dass es über die Eingabeaufforderung funktioniert Es wurde wie folgt repariert.

Einfache Frage

Warum gibt es mehrere Möglichkeiten, Unterprozessen Befehle zu erteilen? Ich wünschte, ich könnte es vereinheitlichen.

Recommended Posts

Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
Die Geschichte, ein Paket zu erstellen, das den Betrieb von Juman (Juman ++) & KNP beschleunigt
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
Die Geschichte des Exportierens eines Programms
Eine Geschichte, die auf eine Vergleichsberechnung stieß
Die Geschichte der Erstellung einer Website, auf der die Veröffentlichungsdaten von Büchern aufgeführt sind
Die Geschichte der Verarbeitung A von Blackjack (Python)
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
Die Geschichte der Entwicklung einer WEB-Anwendung, die automatisch Fangkopien generiert [MeCab]
Die Geschichte eines Mel-Icon-Generators
Die Geschichte von sys.path.append ()
Die Geschichte der IPv6-Adresse, die ich auf ein Minimum beschränken möchte
Die Geschichte einer Box, die Peppers AL Memory und MQTT miteinander verbindet
Die Geschichte der Erstellung einer Webanwendung, die umfangreiche Lesungen mit Django aufzeichnet
Die Geschichte von Django, wie er eine Bibliothek erstellt, die vielleicht etwas nützlicher ist
Die Geschichte, einen Line Bot zu erstellen, der uns den Zeitplan für die Wettbewerbsprogrammierung erzählt
Die Geschichte des Starts eines Minecraft-Servers von Discord
[Python] Ein Programm, das die Anzahl der Täler zählt
Erstellen Sie einen BOT, der die Discord-URL verkürzt
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Die Geschichte eines neuronalen Netzwerks der Musikgeneration
Die Geschichte, eine harte Zeit mit der gemeinsamen Menge HTTP_PROXY = ~ zu haben
Erzeugen Sie diese Form des Bodens einer Haustierflasche
Eine Geschichte über die Änderung des Master-Namens von BlueZ
Die Geschichte, dass der Rückgabewert von tape.gradient () None war
Zip 4 Gbyte Problem ist eine Geschichte der Vergangenheit
[Python] Ein Programm, das die Positionen von Kängurus vergleicht.
Die Geschichte des Baus von Zabbix 4.4
Ein Werkzeug, das die Gacha von Soshage automatisch dreht
Die Geschichte der Einrichtung eines VIP-Kanals im internen Chatwork
Die Geschichte des Django-Modellfeldes verschwindet aus der Klasse
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Python-Skript, das den Inhalt zweier Verzeichnisse vergleicht
Beim Inkrementieren des Werts eines Schlüssels, der nicht vorhanden ist
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Die Geschichte, dass die Version von Python 3.7.7 nicht an Heroku angepasst wurde
Die Geschichte von Python und die Geschichte von NaN
pandas Ruft den Namen einer Spalte ab, die ein bestimmtes Zeichen enthält
Die Geschichte der Teilnahme an AtCoder
Die Geschichte, dass ein Hash-Fehler bei der Verwendung von Pipenv auftrat
Eine Formel, die einfach das Alter ab dem Geburtsdatum berechnet
Eine Geschichte, die bestätigte, ob die Zahl der Coronas bei jungen Menschen wirklich schnell zunimmt
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Die Geschichte der Release-Arbeit der Anwendung, die Google nicht erzählt
Die Geschichte des "Lochs" in der Akte
Eine kleine süchtig machende Geschichte mit den Berechtigungen des von expdp angegebenen Verzeichnisses (für Anfänger)
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
Eine Geschichte, die die elektronische Bewertung von Prüfungen mit Bilderkennung unterstützt
Die Geschichte, ein Tool zu erstellen, das auf Mac und Windows auf der Spieleentwicklungsseite ausgeführt wird
Die Geschichte des erneuten Bereitstellens des Anwendungsservers
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Die Geschichte des Erstellens eines Bots, der aktive Mitglieder in einem bestimmten Slack-Kanal mit Python anzeigt