2016-08-07 67 views
3

ich auf einem Mac einen cron-Job geplant Terminal am 23.00 Uhr jeden Tag zu öffnen, wie folgt:Schedule Cron-Job öffnen Terminal und Befehl der Reihe nach ausgeführt werden

0 23 * * * open -a Terminal 

Das funktioniert gut! Aber ich möchte nicht nur Terminal öffnen, sondern auch einen einfachen Befehl darin ausführen. Vom Blick online, it looks as if cron commands can be chained with &&:

0 23 * * * open -a Terminal && echo 'Hello, world!' 

jedoch dieser modifizierte Cron-Job öffnet nur Klemme, ohne dass es den zweiten Befehl ausgeführt wird. Irgendwelche Gedanken darüber, wie ich den Cron-Job bekommen kann, beides zu tun?

Antwort

1

Die folgende Antwort [nach dem Trennzeichen] setzt voraus, dass Sie den zweiten Befehl innerhalb von [innerhalb] des Terminals ausführen möchten. Andernfalls müssen Sie nur die Befehle auf Ihrem cronjob tauschen (weil zur Zeit, wie Sie es haben, nur die echonachTerminal Exits ausgeführt wird), wie zum Beispiel:

0 23 * * * echo 'Hello, world!' && open -a Terminal 

Nun, vorausgesetzt, Sie wollen

ich nicht bewusst bin, dass Terminal Anwendung (von /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal) akzeptiert [dh interpretiert] alle Befehlszeilenargumente noch wird es lesen alles: den Befehl innerhalb die neu hervorgebracht Terminal laufen von [einer Standardausgabe umgeleitet zu] Standardeingabe.

Was Sie tun mit open -a Terminal && echo 'Hello, world!' grundsätzlich den Aufruf der Terminal Anwendung und [wenn sie erfolgreich] Druck 'Hello, world!' auf der gleichen Schale, die den vorherigen Befehl genannt (die Terminal). Dies ist analog zum Ausführen von zwei separaten Befehlen in derselben Shell, aber nur zum Ausführen des letzten, wenn der erste erfolgreich ist.

Wenn Sie einen bestimmten Befehl wollen (sagen wir echo 'Hello, world!') jedes Mal bash (derzeit die Standard-osx-Shell) geladen wird für den aktuellen Benutzer ausgeführt werden (wie in, jedes Mal wenn der Benutzer öffnet ein Terminal), können Sie hinzufügen, dass Befehl an ~/.bash_profile. Zum Beispiel:

echo "echo 'Hello, world!'" >> ~/.bash_profile 

Nun, wenn öffnen Sie ein Terminal, der Befehl `echo‚Hallo Welt!‘“ Ausgeführt wird

Da die neueste Version von Mac OS X enthält keine ~/.bash_profile standardmäßig für. jeder Benutzer, können Sie dieses Angebot nutzen und Ihre crontab ändern:

0 23 * * * echo "echo 'Hello, world!' > ~/.bash_profile" && open -a Terminal 

grundsätzlich die Inhalte für jedes Mal, dieser crontab Eintrag ausgeführt von ~/.bash_profile ersetzt Dies wird und öffnet die Terminal.

Der Nachteil auf diese Weise ist, dass was auch immer Sie in ~/.bash_profile setzen, für jede geöffnete Terminal ausgeführt wird, unabhängig davon, dass der von der Crontab ist, oder jeder andere der Benutzer zu jeder beliebigen Zeit öffnen kann.

Um dies zu lösen, können Sie auch die ~/.bash_profile Datei aus sie zu entfernen, durch eine Hinter rm -f ~/.bash_profile Befehl nach dem echo 'Hello, world!' Abdrucken:

0 23 * * * echo "echo 'Hello, world!'; rm -f ~/.bash_profile" > ~/.bash_profile" && open -a Terminal 

Dies führt dazu, dass, wenn Terminal öffnet und ruft bash, alle ~/.bash_profile Befehle werden ausgeführt, einschließlich der nachfolgenden rm -f ~/.bash_profile, so dass der nächste Aufruf an Terminal wird nicht erneut Ihren Befehl auslösen, da die ~/.bash_profile nicht mehr existiert.

Nebenbei bemerkt: Wenn aus irgendeinem Grund haben Sie bereits eine ~/.bash_profile Datei, statt den gesamten Inhalt sie zu ersetzen und es nach dem Entfernen können Sie ein Backup der ursprünglichen, hängen Sie Ihre Befehle [einschließlich der, die zur Wiederherstellung Originaldatei] und öffnen Sie das Terminal. Aber ich denke, das ist nicht dein Fall (jedenfalls, wenn es ist, kann ich diese Antwort mit den Details erweitern).

+1

Danke für die gründliche Antwort! –

0

Sie ein Skript erstellen können my_cron_job.sh sagen und führen Sie es über cron 0 23 * * * my_cron_job.sh absoluten Pfad zum Beispiel an das Skript angeben /users/your_user_name/scripts/my_cron_job.sh

1

Große Antworten bereitgestellt bereits von pah und Sameer Naik, aber ich endete mit einer noch einfacheren Lösung geht Apple Verwendung von an SO answer to a similar question inspiriert.

0 23 * * * osascript -e 'tell application "Terminal" to do script "echo \"Hello, world\"!"' 
+0

Sehr interessante Lösung :) – pah

+0

Nur meine persönliche Beobachtung auf SO so weit. Viele Leute denken, dass termimal eine Anwendung ist, mit der Sie einige obskure Befehle ausführen können. Aber es macht Sie nur auf UNIX-Shell-Eingabeaufforderung verfügbar. Es gibt andere Terminal-Software wie iTerm2, die die gleiche Funktion haben. Also IMHO, mit einem Shell-Skript über Cron aufgerufen am einfachsten ist, aber ich verstehe, dass "einfacher" hängt von jedem Komfort Niveau. –

+0

Nicht sicher, was Sie mit obskuren Befehlen meinen, Terminal ist ziemlich einfach. Eine Codezeile scheint einer neuen Datei vorzuziehen. Nicht wirklich über Komfort, mehr über Praktikabilität. –