Чому у мене немає запису crontab в OS X під час використання vim?


77

Я хотів би використовувати cron на своєму Mac. Я обираю це launchd, бо хочу мати можливість використовувати свої нові знання і в Linux. Однак, здається, я не можу змусити crontab -eкоманду спрацювати. Це запускає vim, я вступаю у свою тестову роботу:

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

Але після збереження та виходу ( :wq),

crontab -l

каже:

No crontab for mollerhoj3

Що я роблю не так?


після збереження та виходу з друку роздруковується crontab: installing new crontabна терміналі?
shx2

отже, при виході з редактора ви взагалі не отримуєте вихідних даних?
shx2

О, так , вибачте за такий загадково, я отримую: crontab: no crontab for mollerhoj3а DYLD_ повідомлення
mollerhoj

3
Причиною є, мабуть, те, що ваш vim налаштований не редагувати файли на місці. Дивіться stackoverflow.com/a/11043630/200987 для виправлення. В основному :set backupcopy=yes. Мій MacVim не працює з кронтаб з цієї причини, але я бачив його з - за CRONTAB скаржиться після збереження: crontab: temp file must be edited in place.
олігофрен

Крім того, це могло, оскільки ви використовуєте gvim (OP не вказав). gvim негайно поверніть командний рядок (якщо ви не використовуєте прапор -f), і тому crontab не чекає його закінчення,
Брайан

Відповіді:


185

Просто виконайте такі дії:

  1. У терміналі: crontab -e .
  2. Натисніть i щоб перейти в режим вставки vim.
  3. Введіть свою роботу cron, наприклад:

    30 * * * * /usr/bin/curl --silent --compressed http://example.com/crawlink.php
    
  4. Натисніть Esc щоб вийти з режиму вставки vim.

  5. Тип ZZ для виходу vim (має бути великими літерами).
  6. Ви повинні побачити наступне повідомлення: crontab: installing new crontab. Ви можете перевірити файл crontab за допомогою crontab -l.

Однак зауважте, що це може не працювати залежно від вмісту вашого ~/.vimrcфайлу.


40
ZZ .. не знав цього, набагато перевершує: wq!
Джон Хант,

12
На Mac ви можете встановити nano як редактор за замовчуванням за допомогою:export EDITOR=nano
Hanzaplastique

7
@JohnHunt Вам слід спробувати :x, менше символів :)
Ніклас А.

2
@Nicklas Більш складний для введення текст .. вам потрібно відпустити клавішу Shift наполовину.
Джон Хант

10
@NicklasA: x ризикує плутати з: X - кілька разів, як чувак noob unix, я зашифрував файли і вийшов, не маючи уявлення, що я ввів як ключ шифрування! ZZ здається набагато безпечнішим :-)
Джеймі Боуен,

73

У мене ніколи не було цієї проблеми, але я створюю файл ~ / .crontab і редагую його (що дозволяє мені створювати резервні копії, "Машина часу" чи іншим чином), а потім запускаю

crontab ~/.crontab

Працював у мене понад 20 років у багатьох напрямках Unix.


4
@Rohmer Ні, ти не можеш. Все, що робить, - це змінити поточний набір інструкцій, який використовує ваш cron; він не редагує файл, з якого вийшли ці інструкції. Спробуй це; ви побачите, що cron тепер використовує ваші відредаговані інструкції, але .crontab не змінився.
Michael Campbell

6
Це трохи вводить в оману. crontab ~/.crontabпросто встановлює директиви у файл. Її можна назвати абсолютно будь-якою, і вона буде «працювати», але crontab -eніколи не редагуватиме ~/.crontabабо файл, який ви вибрали. читати man crontab. Ви навіть можете видалити, ~/crontabі ваші крони будуть працювати нормально.
cmroanirgo

40

ПРИМІТКА : відповідь, в якій сказано використовувати ZZкоманду, не працює для мене в моїй системі Mavericks, але це, мабуть, пов’язано з чимось у моїй конфігурації vim, тому що якщо я починаю з первісної .vimrc, прийнята відповідь працює. Моя відповідь може підійти вам, якщо інше рішення не допоможе.

У MacOS X, згідно з керівництвом crontab, тимчасовий файл crontab, який створюється за допомогою, crontab -eслід редагувати на місці. Vim не редагує на місці за замовчуванням ( але це може бути якийсь особливий випадок для підтримкиcrontab -e ), тому, якщо для вашої $EDITORзмінної середовища встановлено значення vi(за замовчуванням), або vimредагування crontab завжди буде невдалим.

Щоб змусити Vim редагувати файл на місці, потрібно виконати:

:setlocal nowritebackup

Це має дозволити вам оновлювати crontab, коли ви робите crontab -eз :wqабоZZ командами.

Ви можете додати автокоманду у .vimrc, щоб це автоматично працювало під час редагування crontabs:

autocmd FileType crontab setlocal nowritebackup

Інший спосіб додати setlocal nowritebackupдо ~/.vim/after/ftplugin/crontab.vim, який буде завантажений Vim автоматично при редагуванні файлу кронтаб , якщо у вас включений плагін Filetype. Ви також можете перевірити наявність ОС, якщо використовуєте файли vim на кількох платформах:

""In ~/.vim/after/ftplugin/crontab.vim
if has("mac")
  setlocal nowritebackup
endif

4
Дякуємо за відповідь на запитання, чого прийнята відповідь насправді не робить. Я стикався з тим самим питанням із Vim, і ви маєте рацію, це було пов’язано з його редагуванням на місці.
Білл

@Dave Це не працює для мене. Я постійно отримую таке повідомлення про помилку:crontab: "/usr/bin/vi" exited with status 1
Kshitij Saraogi

Я виправив це, змінивши редактор з viна vim. Я завжди думав, що обидва однакові.
Kshitij Saraogi

Я помітив, що це трапляється, коли я також намагаюся редагувати інші файли tmp на OSX за допомогою vim. Хтось може пояснити, що особливого в тому, як OSX або vim обробляє файли tmp, які потрібно змінити на місці? Читаючи документацію щодо 'writebackup', він просто говорить, що vim зробить резервну копію перед перезаписом файлу. Якщо це врешті-решт замінить файл, я не розумію, чому він не буде працювати належним чином.
Джефф,

22

Використання cron в OS X не рекомендується. launchdвикористовується замість цього. Спробуйте man launchctlрозпочати. Вам потрібно створити спеціальні XML-файли, що визначають ваші завдання, і розмістити їх у спеціальному місці з певними дозволами.

Зазвичай вам просто потрібно з’ясувати 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/

Редагувати

Якщо ви дійсно хочете використовувати cron в OS X, перевірте цю відповідь: https://superuser.com/a/243944/2449


Я не можу знайти нічого, що повинно вказувати на те, що cron не підтримується в OS X. cron скасовано, так, але, як я вже згадував у своєму питанні, у мене є причина для бажання познайомитися з cron.
mollerhoj

1
Якщо ви намагаєтесь вивчити операції Linux на рідній платформі OS X, розгляньте можливість використання чогось на зразок VirtualBox (віртуальна машина з відкритим кодом) для встановлення дистрибутива Linux у віртуальній машині на вашій машині OS X, щоб ви могли одночасно грати з обома. Ви дізнаєтесь ще більше, побачивши подібність та різницю між ними.
Ренді Говард

24
Ба-Фу-Ві! Ви загубили мене в "Ви повинні створити спеціальні файли XML". 1 рядок crontab набагато простіший, і він чудово працює. Я дізнаюся, що launchd день cron на mac насправді мертвий.
StartupGuy

7
launchd - це кошмар для використання IMHO
jwl

7

Для вирішення цієї проблеми я зробив 2 речі.

  1. Я торкнувся файлу crontab, описаного в цьому посиланні coderwall.com/p/ry9jwg (спасибі @Andy).
  2. Використовував Emacs замість мого vim за замовчуванням: EDITOR=emacs crontab -e(я не уявляю, чому vim не працює)

crontab -lтепер друкує cronjobs. Тепер мені потрібно лише зрозуміти, чому cronjobs все ще не працюють ;-)


1
+1 за зміну редактора crontab -e, це дуже зручно знати
StartupGuy

1
У мене не було проблем з редагуванням crontab за допомогою vim (я отримав crontab: installing new crontabповідомлення), але завдання не працювали. sudo touch /etc/crontabпрацював у мене на Mavericks ..
sjy

6

Різниця між cron та launchd

Як уже зазначалося, cron застарілий (але підтримується), а launchd рекомендується для OS X.

Це взято з developer.apple.com

Ефекти сну та вимкнення

Якщо система вимкнена або не працює, завдання cron не виконуються; вони не працюватимуть до настання наступного призначеного часу.

Якщо ви запланували завдання запуску, встановивши клавішу StartCalendarInterval, і комп’ютер перебуває в режимі сну, коли це завдання мало запуститися, ваше завдання буде запущено, коли комп’ютер прокинеться. Однак, якщо машина вимкнена, коли завдання мало виконуватися, завдання не виконується до наступного призначеного часу.

Усі інші завдання, що запускаються, пропускаються, коли комп’ютер вимкнений або сплячий; вони не працюватимуть до настання наступного призначеного часу.

Отже, якщо комп'ютер завжди вимкнений у запланований час завдання, завдання cron і launchd ніколи не запускаються. Наприклад, якщо ви завжди вимикаєте комп’ютер на ніч, завдання, заплановане на 1 годину ранку, ніколи не буде виконано.


1
Це насправді стосується питання, а не дотичної теми.
Cheezmeister

@Cheezmeister: Це комплімент чи скарга? ;)
Arthaey

4

В користувачеві crontab (crontab -e ) не вводьте поле користувача.

Правильний cron:

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

Синтаксис із полем користувача призначений /etc/crontabлише для :

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

1

Помилка crontab: temp file must be edited in place через те, як vim обробляє файли резервних копій.

Щоб використовувати vim з cron, додайте наступні рядки у свій .bash_profile
export EDITOR=vim
alias crontab="VIM_CRONTAB=true crontab"

Джерело файлу:
source .bash_profile

А потім у своєму .vimrc додайте:
if $VIM_CRONTAB == "true" set nobackup set nowritebackup endif

Це вимкне резервне копіювання при використанні vim з cron. І ви зможете користуватисяcrontab -e для додавання / редагування cronjobs.

Після успішного збереження вашого cronjob ви побачите повідомлення:
crontab: installing new crontab

Джерело:
http://drawohara.com/post/6344279/crontab-temp-file-must-be-edited-in-place введіть тут опис посилання


0

Оскільки попередні повідомлення не працювали для мене через деякі проблеми з дозволами, я виявив, що створення окремого файлу crontab та додавання його до користувацького crontab з параметром -u, поки root працював у мене.

sudo crontab -u {USERNAME} ~/{PATH_TO_CRONTAB_FILE}

0

Вище є поєднання правильних відповідей. Мені вдалося отримати абсолютно однакові помилки:

1) відредагуйте конфігураційний файл bash

$ cd ~ && vim .bashrc

2) у своєму файлі конфігурації bash переконайтеся, що редактором за замовчуванням є vim, а не vi (що спричиняє проблему)

експорт РЕДАКТОР = vim

3) відредагуйте файл конфігурації vim

$ cd ~ && vim .vimrc

4) переконайтеся, що у вашому .vimrc встановлено резервну копію так

встановити резервну копію = так

5) перезапустити термінал

6) тепер спробуйте редагувати crontab

$ crontab -e

10 * * * * ехо "привіт світ"

Ви повинні побачити, що він правильно створює файл crontab. Якщо ви вийдете з vim (або ZZ, або: wq), і перелічіть crontab наступною командою; ви повинні побачити нове завдання cron. Сподіваюся, це допомагає.

$ crontab -l


0

Інший варіант - взагалі не використовувати crontab -e. Натомість я використав:

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

Зверніть увагу, що все, що ви надрукували раніше | crontab -, замінить весь файл crontab, тому використовуйте crontab -l && echo "<your new schedule>"для отримання попереднього вмісту та нового розкладу.


0

Використовуйте інший текстовий редактор

env EDITOR=nano crontab -e 

або

env EDITOR=code crontab -e 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.