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
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!
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.
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.
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.
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?
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?
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.
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.
Warum gibt es mehrere Möglichkeiten, Unterprozessen Befehle zu erteilen? Ich wünschte, ich könnte es vereinheitlichen.
Recommended Posts