Как создать задание крона с помощью Bash автоматически без интерактивного редактора?

library(dplyr)
details_from_top20 <- Inventory %>%
  group_by(Description) %>% 
  summarise(n = sum(QTY)) %>% 
  top_n(20) %>%
  left_join(Inventory) 

Для воспроизводимого примера мы могли бы использовать mtcars и получить все данные для автомобилей, которые имеют передачу с наибольшим общим весом, в данном случае 3 передачи. (Это немного надумано, но структурно та же проблема.)

car_gears_with_top2_weights <- mtcars %>%
  group_by(gear) %>% 
  summarise(total_wt = sum(wt*1000)) %>% 
  top_n(1) %>%
  left_join(mtcars)

# A tibble: 15 x 12
    gear total_wt   mpg   cyl  disp    hp  drat    wt  qsec    vs    am  carb
   <dbl>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1     3    58389  21.4     6  258    110  3.08  3.22  19.4     1     0     1
 2     3    58389  18.7     8  360    175  3.15  3.44  17.0     0     0     2
 3     3    58389  18.1     6  225    105  2.76  3.46  20.2     1     0     1
 4     3    58389  14.3     8  360    245  3.21  3.57  15.8     0     0     4
 5     3    58389  16.4     8  276.   180  3.07  4.07  17.4     0     0     3
 6     3    58389  17.3     8  276.   180  3.07  3.73  17.6     0     0     3
 7     3    58389  15.2     8  276.   180  3.07  3.78  18       0     0     3
 8     3    58389  10.4     8  472    205  2.93  5.25  18.0     0     0     4
 9     3    58389  10.4     8  460    215  3     5.42  17.8     0     0     4
10     3    58389  14.7     8  440    230  3.23  5.34  17.4     0     0     4
11     3    58389  21.5     4  120.    97  3.7   2.46  20.0     1     0     1
12     3    58389  15.5     8  318    150  2.76  3.52  16.9     0     0     2
13     3    58389  15.2     8  304    150  3.15  3.44  17.3     0     0     2
14     3    58389  13.3     8  350    245  3.73  3.84  15.4     0     0     4
15     3    58389  19.2     8  400    175  3.08  3.84  17.0     0     0     2
361
задан Ciro Santilli 新疆改造中心法轮功六四事件 29 July 2017 в 21:13
поделиться

6 ответов

Вы можете добавьте в crontab следующее:

#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello" >> mycron
#install new cron file
crontab mycron
rm mycron

Описание строки Cron

* * * * * "command to be executed"
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

Источник nixCraft .

505
ответ дан 23 November 2019 в 00:15
поделиться

Нет, в crontab нет опции для изменения файлов cron.

Вам необходимо: взять текущий файл cron (crontab -l> newfile), изменить его и поместить новый файл на месте (crontab newfile).

Если вы знакомы с perl, вы можете использовать этот модуль Config :: Crontab .

LLP, Андреа

0
ответ дан 23 November 2019 в 00:15
поделиться

Вы можете сделать это на лету

crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -

crontab -l перечисляет текущие задания crontab, cat печатает ее, echo печатает новую команду, а crontab - добавляет все напечатанные данные в файл crontab. Эффект можно увидеть, выполнив новый crontab -l .

296
ответ дан 23 November 2019 в 00:15
поделиться

EDIT (фиксированная перезапись):

cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
26
ответ дан 23 November 2019 в 00:15
поделиться

Если вы используете Vixie Cron, например, в большинстве дистрибутивов Linux, вы можете просто поместить файл в /etc/cron.d с отдельным заданием cron.

Это работает только для рут конечно. Если ваша система поддерживает это, вы должны увидеть там несколько примеров. (Обратите внимание на имя пользователя, включенное в строку, в том же синтаксисе, что и в старом / etc / crontab)

Это печальная ошибка в cron, что нет способа справиться с этим как обычный пользователь, и что многие реализации cron имеют никак не справиться с этим.

3
ответ дан 23 November 2019 в 00:15
поделиться

Скорее всего, вы автоматизируете это и не хотите, чтобы одно задание добавлялось дважды. В этом случае используйте:

__cron="1 2 3 4 5 /root/bin/backup.sh"
cat <(crontab -l) |grep -v "${__cron}" <(echo "${__cron}")

Это работает, только если вы используете BASH. Мне неизвестен правильный синтаксис DASH ( sh ).

Обновление: Это не работает, если у пользователя еще нет crontab. Более надежный способ:

(crontab -l ; echo "1 2 3 4 5 /root/bin/backup.sh") | sort - | uniq - | crontab - 

В качестве альтернативы, если ваш дистрибутив поддерживает это, вы также можете использовать отдельный файл:

echo "1 2 3 4 5 /root/bin/backup.sh" |sudo tee /etc/crond.d/backup

Нашел их в , другом вопросе SO .

7
ответ дан 23 November 2019 в 00:15
поделиться