Добавить что-нибудь в crontab программно (через ssh)

ntpdate не сбрасывает флаг STA_UNSYNC при настройке системного времени. Таким образом, ядро ​​считает, что системное время недействительно, и не обновляет RTC. Он не очищает STA_UNSYNC , потому что он использует adjtime () для установки системного времени вместо adjtimex () .

Чтобы использовать функцию CONFIG_RTC_SYSTOHC , вы должны использовать инструмент, который очищает флаг STA_UNSYNC , то есть ntpd .

Возможно, о проблеме следует сообщить разработчикам ntpdate .

16
26.07.2016, 03:39
2 ответа

Это адаптация того, что предложил @phillip -zyan -k -lee -Stockmann , основанный на его коде «Лучшая идея на данный момент».

Мои изменения по сравнению с его (превосходным и полезным фрагментом )в основном:

  • Регулярное выражение не только для имени команды, но и для всей записи, включая строки времени. Таким образом, он может поддерживать добавление команды, даже если в других записях есть те же -именованные или перекрывающиеся -именованные команды. (Она по-прежнему не будет добавлять одну и ту же команду в одно и то же расписание дважды.)
  • Немного логирования
  • Я переключил (и назвал )мой на почасовой по разным причинам; легко настроить обратно в соответствии с синтаксисом crontab

Вот мой код того, что я назвалcrontab-add-hourly.sh:

#!/bin/bash

# PURPOSE:
# To allow simple, programmatic addition of commands/entries into the crontab (if not already present)

cmd=$1
entry="0 * * * * $cmd"
printf "we want to add this entry:\n$entry\n\n" 
escapedEntry=$(printf '%s\n' "$entry" | sed 's:[][\/.^$*]:\\&:g') #from: https://unix.stackexchange.com/a/129063/320236
printf "but first we'll see if it's already in there using this regex pattern:\n$escapedEntry\n\n"

if [[ $(crontab -l | egrep -v '^(#|$)' | grep -q "$escapedEntry"; echo $?) == 1 ]] # from: https://unix.stackexchange.com/a/297377/320236
then
    printf "all clear; pattern was not already present; adding command to crontab hourly:\n$cmd\n\n"
    (crontab -l ; printf "$entry\n\n") | crontab -
else
    printf "pattern already present; no action taken\n\n"
fi

Пример использования и вывода:

$./crontab-add-hourly.sh my-script.bash

we want to add this entry:
0 * * * * my-script.bash

but first we'll see if it's already in there using this regex pattern:
0 \* \* \* \* my-script\.bash

all clear; pattern was not already present; adding command to crontab hourly:
my-script.bash
1
20.08.2021, 12:02

TL;DR :Это действительно работает, проверено в Bash 4.4.

if [[ $(crontab -l | egrep -v "^(#|$)" | grep -q 'some_command'; echo $?) == 1 ]]
then
    set -f
    printf "$(crontab -l ; echo '* * * * * some_command')\n" | crontab -
    set +f
fi

Как отмечено в комментариях @Phillip -Zyan K Lee -Stockmann answer, это решение расширяет *все файлы в текущем каталоге. Я не мог заставить комментарии работать. set -f отключает подстановочное расширение, см.https://stackoverflow.com/a/11456496/915441.

1
20.08.2021, 12:02

Теги

Похожие вопросы