Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Remote befehl mit dbclient rückgabewert bei cron ausführung verschwunden

Frage Entwicklung Batch & Shell

Mitglied: Asgaroth

Asgaroth (Level 1) - Jetzt verbinden

29.03.2011 um 16:08 Uhr, 4150 Aufrufe, 2 Kommentare

Skript funktioniert bei normaler Ausführung, jedoch nicht bei Ausführung per cron/crontab (vmware esxi, busybox, /bin/sh)

Hallo,

ich habe ein Shell-Script auf unserem ESXi Server geschrieben, welches auf einem anderen ESXi Server einen Befehl ausführt ( df ).
Wenn ich das Script "per Hand" ausführe und den Rückgabewert ausgebe, funktioniert alles, wie es soll. Wenn ich das ganze in /var/spool/cron/crontab/root packe, funktioniert es nicht mehr und ich erhalte keinen Rückgabewert.

1. Hier das Skript (Minimalbeispiel):

#!/bin/sh
someval=$(/bin/dbclient -i /.ssh/serverx_rsa root@192.168.1.55 "df | grep Datastore | awk '{print $4 $6}'")
echo $someval > /tmp/returnvalue

dbclient ist der auf dem ESXi vorhandene dropbearclient, -i ist der rsa key (identity file) für Authentifizierung ohne Passwort.

2. Folgendes habe ich schon überprüft:

cronjob wird als root ausgeführt.
Die Verbindung zum Remote-Server funktioniert (erfolgreiche Verbindung steht in /var/log/messages auf Remote-Server und ein Aufruf mit touch /tmp/testfile anstatt df legte diese Datei an)
Am awk oder grep liegt's nicht, ein Ersetzen des auszuführenden Befehls mit "echo "hallo" oder nur "df" ergab ebenfalls keine Rückgabewerte.
Ich habe den auszuführenden Befehl mit und ohne " und in vielen Varianten ausprobiert....
Ich habe versucht, den Rückgabewert direkt auszugeben (mittels echo) und direkt in eine Datei umzuleiten.

Das einzige was ich mir noch vorstellen kann, wäre, dass der dbclient Befehl vom cron in einer subshell ausgeführt wird, allerdings müsste dann ein direktes Ausgeben per echo doch funktionieren. Außerdem würde es dann wahrscheinlich beim manuellen Ausführen auch nicht funktionieren.

Vielleicht hat ja jemand ne Idee!

Vielen Dank schonmal für Antworten,
asgaroth
Mitglied: Asgaroth
19.04.2011 um 13:53 Uhr
Ich habe jetzt herausgefunden, dass es scheinbar daran liegt das beim Aufruf mit cron kein Terminal zugewiesen wird. Ich konnte dieses Problem durch das explizite zuweisen eines
Pseudoterminals zum Teil lösen.

Der obige Befehl sieht dann abgeändert wie folgt aus:

someval=$(/bin/dbclient -i /.ssh/serverx_rsa root@192.168.1.55 "df | grep Datastore" < /dev/ptyp7)

Die " " um den auszuführenden Befehl sind wichtig.
Das Pipen in anderen Befehle funktioniert aber nur zum Teil (u.a. wenn " verwendet werden).

Daher dann das ganze erst in der Ausgabe:

echo $someval | awk '{print $4 " " $6}' > /tmp/returnvalue

So funktionierts jetzt zumindest zum Teil (teste gerade nochmal alles). Falls ich das Skript im Ganzen zum laufen bekomme markiere ich den Beitrag hier als gelöst!
Bitte warten ..
Mitglied: eddylucas
19.04.2011 um 16:38 Uhr
Hi,
ich habe die letzten paar Tage zufälligerweise genau das gleiche Problem gehabt.
Und heute hab ich endlich die Lösung gefunden:

Ich wollte in etwa folgenden Befehl von crond ausführen lassen:
dbclient -T -i /.ssh/keys/work.db root@192.168.1.5 -R 4545:192.168.1.5:22

-T habe ich angegeben, damit explizit kein PTY zugewiesen wird.
Diese Zeile habe ich der einfachheithalber in ein Skript gepackt, inklusive einer Testzeile, damit ich später prüfen konnte, ob das Skript überhaupt von crond ausgeführt wird:

dbconn.sh
01.
#!/bin/ash 
02.
echo test >> /tmp/test.txt 
03.
dbclient -T -i /.ssh/keys/work.db root@192.168.1.5 -R 4545:192.168.1.3:22
Dieses Skript starte ich manuell und lasse es im Hintergrund laufen mit:
nohup /sbin/dbconn.sh &
(Falls unbekannt: nohup (No Hangup) stellt sicher, dass ein damit gestarteter Prozess beim z.B. ausloggen nicht beendet wird.)

Da das ganze manuell funktionierte, probierte ich als nächstes diesen Aufruf per crond automatisch starten zu lassen.
Crond führte dann auch auf jeden Fall das Skript aus, denn /tmp/test.txt wuchs in dem Intervall, das ich in der crontab definiert hatte, stetig an.
Doch dbclient wollte partout keine Verbindung zu 192.168.1.5 aufbauen und der Process beendete sich nach kurzer Zeit einfach!
Nach langem rumprobieren hab ich dann jedoch endlich des Rätsels Lösung gefunden:
Ein simples -N als weiterer Parameter... und alles läuft wie es soll.
D.h. das Skript lautet nun in seiner Finalversion so:
01.
#!/bin/ash 
02.
dbclient -T -N -i /.ssh/keys/work.db root@192.168.1.5 -R 4545:192.168.1.3:22
Laut http://linux.die.net/man/1/dbclient steht -N für:
Don't request a remote shell or run any commands. Any command arguments are ignored.

Ich habe bisher noch nicht probiert, ob das -T überflüssig macht. Ich war heute erstmal froh, dass ich's hinbekommen habe.
Hoffe das hilft dir und anderen, war wieder mal ein Problem wo selbst stundenlanges Googlen keine Früchte trug, sondern gutes altes Trial & Error.^^

Gruß und frohe kommende Ostern!
Bitte warten ..
Ähnliche Inhalte
Windows 7
Link auf Desktop um CMD Befehl auszuführen (7)

Frage von XPFanUwe zum Thema Windows 7 ...

Batch & Shell
gelöst Powershell - User Remote abmelden (4)

Frage von Bugger zum Thema Batch & Shell ...

Windows Server
Statt Remote Desktop nur RemoteApp (6)

Frage von IrgendEinName zum Thema Windows Server ...

Batch & Shell
gelöst Remote Prozesse Beenden (6)

Frage von Hanuta zum Thema Batch & Shell ...

Neue Wissensbeiträge
Heiß diskutierte Inhalte
Viren und Trojaner
Ransomware .nm4 (14)

Frage von Zyklo92 zum Thema Viren und Trojaner ...

Microsoft Office
+1.000 Ordner in Outlook: Wie besser? (11)

Frage von Matsushita zum Thema Microsoft Office ...

Zusammenarbeit
Administrator Verhalten nach Vertragskündigung (10)

Frage von sysbone zum Thema Zusammenarbeit ...