Prüfen ob python Script über Shell gestartet wurde

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hallo!

Ich habe ein Python Script für die Version2.7 geschrieben, welches mit subprocess und Popen ein Ansible-Skript startet. Dieses Script kann manuelle über die bash gestartet werden und ich verwende es auch in einem cronjob. Um den Info-Overhead, den Ansible beim Ausführen an die Shell ausgibt, habe ich das alles etwas kanalisiert und schreibe die Ausgaben der Ansibleskript-Ausführung in eine Variable, die ich dann auswerte um eine mögliche Fehlermeldung daraus zu machen.

Code: Alles auswählen

        ansible_command = 'ansible-playbook /home/devops/ansible/playbooks/info/script.yml -l ' + env_choice
        extra_vars = ' --extra-vars "ip=' + ip + ' date=' + check_date + ' path=' + path + '"'
        ansible_command += extra_vars
        proc = subprocess.Popen(ansible_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,)
        output = proc.communicate()[0]
        if "ok:" not in output:
            print "\033[1;41mFehler bei XY {0} \033[0m"\
                    .format(ip)
            print output
Nun ist es aber so, dass es bei der Ausführung als cronjob immer zum Fehler führt, weil ddei if-bedingung offenbar nur funktioniert, wenn eine aktive bash dieses Skript ausführt. Wie kann ich bei der Ausführung des Skriptes prüfen, ob es als cronjob läuft oder vom user gestartet wurde? Damit habe ich dann die Möglichkeit die Prüfung zu ändern und Fehler evtl als log-Datei zu schreiben.

VG niesel
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@nieselfriem: Du solltest ersteinmal schauen, welchen Fehler es beim Starten per cron gibt, denn prinzipiell sollte das ja schon funktionieren. Du solltest keine Processe per shell=True starten, sondern die Parameter als Liste übergeben:

Code: Alles auswählen

        ansible_command = ['ansible-playbook', '/home/devops/ansible/playbooks/info/script.yml', '-l', env_choice]
        extra_vars = ['--extra-vars', 'ip={} date={} path={}'.format(ip, check_date, path)]
        proc = subprocess.Popen(ansible_command + extra_vars, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        output, error = proc.communicate()
        if "ok:" not in output:
            print "\033[1;41mFehler bei XY {0} \033[0m".format(ip)
            print output
            print error
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

naja, das Skript startet schon und läuft auch fast wie gewünscht. Es werden nur eben die Fehlerausgaben erzeugt obwohl der rest funktioniert, weil im cron Modus keine Ausgabe in die Variable output geschrieben wird. Aber ich werde es mal so probieren, wie du es mir geraten hast.

VG niesel
Antworten