Warum habe ich unter OS X keinen Crontab-Eintrag, wenn ich vim verwende?

77

Ich möchte Cron auf meinem Mac verwenden. Ich entscheide mich dafür launchd, weil ich mein neues Wissen auch unter Linux nutzen möchte. Ich kann den crontab -eBefehl jedoch nicht zum Laufen bringen . Es wird ausgelöst, ich gebe meinen Testjob ein:

0-59 * * * * mollerhoj3 echo "Hello World"

Aber nach dem Speichern und Beenden ( :wq),

crontab -l

sagt:

No crontab for mollerhoj3

Was mache ich falsch?

mollerhoj
quelle
Wird es nach dem Speichern und Beenden crontab: installing new crontabauf dem Terminal ausgedruckt?
Shx2
Wenn Sie den Editor verlassen, erhalten Sie überhaupt keine Ausgabe?
shx2
Oh, ja, tut mir leid, dass ich so kryptisch bin. Ich bekomme : crontab: no crontab for mollerhoj3und die DYLD_- Nachricht
mollerhoj
3
Der Grund ist wahrscheinlich, dass Ihr vim so konfiguriert ist, dass Dateien nicht an Ort und Stelle bearbeitet werden. Eine Lösung finden Sie unter stackoverflow.com/a/11043630/200987 . Grundsätzlich :set backupcopy=yes. Mein MacVim funktioniert aus diesem Grund nicht mit Crontab, aber ich habe es gesehen, weil sich Crontab nach dem Speichern beschwert hat : crontab: temp file must be edited in place.
Oligofren
Darüber hinaus könnte dies daran liegen, dass Sie gvim verwenden (OP nicht angegeben). gvim gibt die Eingabeaufforderung sofort zurück (wenn Sie das Flag -f nicht verwenden), und deshalb wartet crontab nicht darauf, dass es beendet wird,
Brian

Antworten:

185

Befolgen Sie einfach diese Schritte:

  1. Im Terminal : crontab -e.
  2. Drücken Sie i, um in den Einfügemodus von vim zu wechseln.
  3. Geben Sie Ihren Cron-Job ein, zum Beispiel:

    30 * * * * /usr/bin/curl --silent --compressed http://example.com/crawlink.php
    
  4. Drücken Sie Escden Eingabemodus der Ausgang vim.

  5. Geben Sie ein ZZ, um vim zu beenden (muss aus Großbuchstaben bestehen).
  6. Sie sollten die folgende Meldung sehen : crontab: installing new crontab. Sie können die crontab-Datei mithilfe von überprüfen crontab -l.

Beachten Sie jedoch, dass dies je nach Inhalt Ihrer ~/.vimrcDatei möglicherweise nicht funktioniert .

Cao Manh Dat
quelle
40
ZZ .. wusste das nicht, weit überlegen: wq!
John Hunt
12
Auf dem Mac können Sie Nano als Standardeditor export EDITOR=nano
festlegen
7
@ JohnHunt Sie sollten versuchen :x, weniger Charakter :)
Nicklas A.
2
@Nicklas A Komplexer zu tippen. Sie müssen die Umschalttaste zur Hälfte loslassen.
John Hunt
10
@NicklasA: x läuft Gefahr, verwechselt zu werden mit: X - mehrmals als Noob-Unix-Typ habe ich Dateien verschlüsselt und ohne Ahnung, was ich als Verschlüsselungsschlüssel eingegeben habe, beendet! ZZ scheint viel sicherer :-)
Jamie Bowen
73

Ich hatte dieses Problem noch nie, aber ich erstelle eine ~ / .crontab-Datei und bearbeite diese (wodurch ich sie sichern kann, Time Machine oder auf andere Weise) und führe sie dann aus

crontab ~/.crontab

Hat über 20 Jahre für mich in vielen Unix-Varianten gearbeitet.

Michael Campbell
quelle
4
@Rohmer Nein, das kannst du nicht. Sie müssen lediglich die aktuell ausgeführten Anweisungen ändern, die Ihr Cron verwendet. Die Datei, aus der diese Anweisungen stammen, wird nicht bearbeitet. Versuch es; Sie werden sehen, dass cron jetzt Ihre bearbeiteten Anweisungen verwendet, aber .crontab hat sich nicht geändert.
Michael Campbell
6
Das ist etwas irreführend. crontab ~/.crontabInstalliert einfach die Anweisungen in der Datei. Es kann absolut alles benannt werden und es wird "funktionieren", aber crontab -eniemals bearbeiten ~/.crontaboder welche Datei auch immer Sie ausgewählt haben. lesen man crontab. Sie können sogar löschen ~/crontabund Ihre Cron läuft einwandfrei.
cmroanirgo
40

HINWEIS : Die Antwort, die besagt, dass der ZZBefehl verwendet werden soll, funktioniert auf meinem Mavericks-System nicht, aber dies liegt wahrscheinlich an etwas in meiner vim-Konfiguration, da .vimrcdie akzeptierte Antwort funktioniert, wenn ich mit einer makellosen Antwort beginne . Meine Antwort könnte für Sie funktionieren, wenn die andere Lösung dies nicht tut.

Unter MacOS X muss laut der Crontab-Manpage die temporäre Crontab-Datei, mit der erstellt wird crontab -e, direkt bearbeitet werden. Vim wird standardmäßig nicht direkt bearbeitet ( dies kann jedoch in besonderen Fällen unterstützt werdencrontab -e ). Wenn Ihre $EDITORUmgebungsvariable auf " viStandard" oder "Standard" eingestellt ist vim, schlägt die Bearbeitung der Crontab immer fehl.

Damit Vim die Datei direkt bearbeitet, müssen Sie Folgendes tun:

:setlocal nowritebackup

Dies sollte es Ihnen ermöglichen, die crontab zu aktualisieren, wenn Sie crontab -emit den Befehlen :wqoder arbeiten ZZ.

Sie können Ihrem .vimrc einen automatischen Befehl hinzufügen, damit dies beim Bearbeiten von crontabs automatisch funktioniert:

autocmd FileType crontab setlocal nowritebackup

Eine andere Möglichkeit ist das Hinzufügen von setlocal nowritebackupto ~/.vim/after/ftplugin/crontab.vim, das von Vim automatisch geladen wird, wenn Sie eine Crontab-Datei bearbeiten, wenn Sie das Dateityp-Plugin aktiviert haben. Sie können auch nach dem Betriebssystem suchen, wenn Sie Ihre VIM-Dateien auf mehreren Plattformen verwenden:

""In ~/.vim/after/ftplugin/crontab.vim
if has("mac")
  setlocal nowritebackup
endif
Dave Meybohm
quelle
4
Vielen Dank für die Beantwortung der Frage, die die akzeptierte Antwort eigentlich nicht tut. Ich hatte das gleiche Problem mit Vim und Sie haben Recht, es hatte mit der direkten Bearbeitung zu tun.
Bill
@ Dave Das funktioniert bei mir nicht. Ich crontab: "/usr/bin/vi" exited with status 1
bekomme
Ich habe es behoben, indem ich den Editor von viauf geändert habe vim. Ich dachte immer, beide wären gleich.
Kshitij Saraogi
Ich habe festgestellt, dass dies passiert, wenn ich auch versuche, andere tmp-Dateien unter OSX mit vim zu bearbeiten. Kann jemand erklären, was das Besondere daran ist, wie OSX oder vim mit TMP-Dateien umgehen, die an Ort und Stelle geändert werden müssen? Wenn Sie die Dokumentation zu 'Writebackup' lesen, heißt es einfach, dass vim ein Backup erstellt, bevor eine Datei überschrieben wird. Wenn es die Datei irgendwann überschreibt, verstehe ich nicht, warum es nicht richtig funktioniert.
Jeff
22

Von der Verwendung von cron unter OS X wird abgeraten. launchdwird stattdessen verwendet. Versuchen Sie man launchctl, loszulegen. Sie müssen spezielle XML-Dateien erstellen, die Ihre Jobs definieren, und diese mit bestimmten Berechtigungen an einem bestimmten Ort ablegen.

Normalerweise müssen Sie nur herausfinden launchctl load

http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/launchctl.1.html

http://nb.nathanamy.org/2012/07/schedule-jobs-using-launchd/

Bearbeiten

Wenn Sie cron wirklich unter OS X verwenden möchten, lesen Sie die folgende Antwort: https://superuser.com/a/243944/2449

Andy
quelle
Ich kann nichts finden, was darauf hindeuten könnte, dass cron unter OS X nicht unterstützt wird. Cron ist zwar benachteiligt, aber wie ich in meiner Frage erwähnt habe, habe ich einen Grund, cron kennenzulernen.
Mollerhoj
1
Wenn Sie versuchen, Linux-Operationen auf einer nativen OS X-Plattform zu erlernen, sollten Sie VirtualBox (Open Source VM) verwenden, um eine Linux-Distribution in einer VM auf Ihrem OS X-Computer zu installieren, damit Sie mit beiden gleichzeitig spielen können. Sie werden noch mehr lernen, wenn Sie die Ähnlichkeiten und Unterschiede zwischen ihnen erkennen.
Randy Howard
24
Bah-Foo-Wee! Sie haben mich bei "Sie müssen spezielle XML-Dateien erstellen" verloren. 1 Crontab-Linie ist viel einfacher und funktioniert einwandfrei. Ich werde lernen, wie man den Tag startet, an dem Cron auf dem Mac tatsächlich tot ist.
StartupGuy
7
launchd ist ein Albtraum, IMHO
jwl
7

Ich habe zwei Dinge getan, um dieses Problem zu lösen.

  1. Ich habe die Crontab-Datei berührt, die in diesem Link coderwall.com/p/ry9jwg (Danke @Andy) beschrieben ist.
  2. Verwendete Emacs anstelle meines Standard-Vim: EDITOR=emacs crontab -e(Ich habe keine Ahnung, warum Vim nicht funktioniert.)

crontab -ldruckt jetzt die cronjobs. Jetzt muss ich nur noch herausfinden, warum die Cronjobs immer noch nicht laufen ;-)

mollerhoj
quelle
1
+1 für das Ändern des Editors für crontab -e, das ist sehr praktisch zu wissen
StartupGuy
1
Ich hatte kein Problem damit, die Crontab mit vim zu bearbeiten (ich habe die crontab: installing new crontabNachricht erhalten), aber Jobs wurden nicht ausgeführt. sudo touch /etc/crontabarbeitete für mich an Mavericks ..
sjy
6

Unterschied zwischen cron und launchd

Wie bereits erwähnt, ist cron veraltet (wird jedoch unterstützt), und launchd wird für OS X empfohlen.

Dies ist aus entnommen developer.apple.com übernommen

Auswirkungen des Schlafens und Ausschaltens

Wenn das System ausgeschaltet ist oder schläft, werden Cron-Jobs nicht ausgeführt. Sie werden erst ausgeführt, wenn die nächste festgelegte Zeit erreicht ist.

Wenn Sie einen gestarteten Job durch Setzen des StartCalendarInterval-Schlüssels planen und der Computer schläft, wenn der Job hätte ausgeführt werden sollen, wird Ihr Job ausgeführt, wenn der Computer aufwacht. Wenn der Computer jedoch ausgeschaltet ist, wenn der Job ausgeführt werden sollte, wird der Job erst ausgeführt, wenn die nächste festgelegte Zeit eintritt.

Alle anderen gestarteten Jobs werden übersprungen, wenn der Computer ausgeschaltet ist oder schläft. Sie werden erst ausgeführt, wenn die nächste festgelegte Zeit erreicht ist.

Wenn der Computer zum geplanten Zeitpunkt des Jobs immer ausgeschaltet ist, werden daher sowohl Cron-Jobs als auch Launchd-Jobs nie ausgeführt. Wenn Sie beispielsweise Ihren Computer nachts immer ausschalten, wird ein Job, der um 1 Uhr morgens ausgeführt werden soll, niemals ausgeführt.

Roobie Nuby
quelle
1
Dies befasst sich tatsächlich mit der Frage und nicht mit dem Thema Tangential Vim.
Cheezmeister
@Cheezmeister: Ist das ein Kompliment oder eine Beschwerde? ;)
Arthaey
4

Fügen Sie in user crontab ( crontab -e) das Benutzerfeld nicht ein.

Richtige Cron ist:

0-59 * * * * echo "Hello World"

Die Syntax mit Benutzerfeld gilt /etc/crontabnur für :

0-59 * * * * mollerhoj3 echo "Hello World"
user3130043
quelle
1

Der Fehler crontab: temp file must be edited in placeist auf die Art und Weise zurückzuführen, wie vim Sicherungsdateien behandelt.

Um vim mit cron zu verwenden, fügen Sie die folgenden Zeilen in Ihr .bash_profile ein
export EDITOR=vim
alias crontab="VIM_CRONTAB=true crontab"

Quelle der Datei:
source .bash_profile

Und dann fügen Sie in Ihrer .vimrc hinzu:
if $VIM_CRONTAB == "true" set nobackup set nowritebackup endif

Dadurch werden Sicherungen deaktiviert, wenn vim mit cron verwendet wird. Und Sie können damit crontab -eCronjobs hinzufügen / bearbeiten.

Wenn Sie Ihren Cronjob erfolgreich gespeichert haben, wird folgende Meldung angezeigt:
crontab: installing new crontab

Quelle:
http://drawohara.com/post/6344279/crontab-temp-file-must-be-edited-in-place Geben Sie hier die Linkbeschreibung ein


quelle
0

Da die vorherigen Beiträge aufgrund einiger Berechtigungsprobleme bei mir nicht funktionierten, stellte ich fest, dass das Erstellen einer separaten Crontab-Datei und das Hinzufügen zur Crontab-Datei des Benutzers mit dem Parameter -u, während root für mich funktionierte.

sudo crontab -u {USERNAME} ~/{PATH_TO_CRONTAB_FILE}
ShaneMit
quelle
0

Das Obige hat eine Mischung aus richtigen Antworten. Was für mich funktioniert hat, um genau die gleichen Fehler zu haben, sind:

1) Bearbeiten Sie Ihre Bash-Konfigurationsdatei

$ cd ~ && vim .bashrc

2) Stellen Sie in Ihrer Bash-Konfigurationsdatei sicher, dass der Standardeditor vim und nicht vi ist (was das Problem verursacht).

export EDITOR = vim

3) Bearbeiten Sie Ihre vim-Konfigurationsdatei

$ cd ~ && vim .vimrc

4) Stellen Sie sicher, dass die gesetzte Sicherungskopie in Ihrer .vimrc Ja ist

setze backupcopy = yes

5) Terminal neu starten

6) Versuchen Sie nun Crontab Edit

$ crontab -e

10 * * * * Echo "Hallo Welt"

Sie sollten sehen, dass die Crontab-Datei korrekt erstellt wird. Wenn Sie vim (entweder ZZ oder: wq) beenden und crontab mit dem folgenden Befehl auflisten; Sie sollten den neuen Cron-Job sehen. Hoffe das hilft.

$ crontab -l

Jimmy MG Lim
quelle
0

Eine andere Option ist, überhaupt nicht zu verwenden crontab -e. Stattdessen habe ich verwendet:

(crontab -l && echo "1 1  * * *  /path/to/my/script.sh") | crontab -

Beachten Sie, dass alles, was Sie zuvor gedruckt | crontab -haben, die gesamte Crontab-Datei ersetzt. Verwenden Sie diese Option, crontab -l && echo "<your new schedule>"um den vorherigen Inhalt und den neuen Zeitplan abzurufen.

Johandry
quelle
0

Verwenden Sie einen anderen Texteditor

env EDITOR=nano crontab -e 

oder

env EDITOR=code crontab -e 
Achraf
quelle