Необходимо установить DEBIAN_FRONTEND = noninteractive
. Кажется, я припоминаю, что его было немного сложно найти, поскольку на самом деле это опция для debconf
, а не для apt-get
. Тем не менее, это упоминается, например, здесь и, конечно же, в руководстве к debconf
.
Итак, создайте сценарий, содержащий
#/bin/sh
DEBIAN_FRONTEND=noninteractive apt-get upgrade -q -y
, и запустите его из cron. И не забудьте также запустить apt-get update
.
Конечно, возможно, вам стоит использовать unattended-upgrade
или что-то специально разработанное для этого.
Но у меня есть одна машина Debian, использующая этот сценарий, и он работает нормально:
#/bin/sh
apt-get -q -q update
if apt-get -s upgrade | grep -q "0 upgraded" ; then
true
else
DEBIAN_FRONTEND=noninteractive apt-get -y -q upgrade
fi
Первый apt-get -s
предназначен для подавления вывода и бесполезной электронной почты на случай, если нечего обновлять.
Аналогичный вопрос на askubuntu.
Я нашел своего рода хак, чтобы хотя бы выводить четко структурированную информацию о том, какая цель зависит от каких предпосылок. Минус в том, что это довольно навязчиво. Другими словами, вам нужно изменить свой make-файл, чтобы обернуть рецепты сборки всех ваших целей в небольшую условную функцию. Выложу краткий пример:
getRecipe = $(if $(DEPENDENCY_GRAPH),@echo Target $@ depends on prerequisites "$^",$(1))
VARIABLE_TARGET_NAME = foobar.txt
all : TopLevelTarget
TopLevelTarget : Target_A Target_D
$(call getRecipe,\
@echo Building target $@)
Target_A : Target_B
$(call getRecipe,\
@echo Building target $@)
Target_D : Target_C
$(call getRecipe,\
@echo Building target $@)
Target_B : $(VARIABLE_TARGET_NAME)
$(call getRecipe,\
@echo Building target $@)
Target_C :
$(call getRecipe,\
@echo Building target $@)
$(VARIABLE_TARGET_NAME) :
$(call getRecipe,\
@echo Building target $@)
В этом примере я использую -свернутую вручную функцию getRecipe, чтобы обернуть рецепт каждой отдельной цели, а затем решить, действительно ли запустить этот рецепт или просто вывести, какая цель создается и от каких предварительных требований она зависит. Последнее происходит, только если переменная DEPENDENCY_GRAPH
установлена (, например. как переменная окружения ). В этом примере рецепт сборки — это не более чем эхо, говорящее о том, что цель строится, но вы, очевидно, можете заменить его командой по вашему выбору.
Если для параметра DEPENDENCY_GRAPH
установлено значение 1, это приводит к выходу:
Target foobar.txt depends on prerequisites ""
Target Target_B depends on prerequisites "foobar.txt"
Target Target_A depends on prerequisites "Target_B"
Target Target_C depends on prerequisites ""
Target Target_D depends on prerequisites "Target_C"
Target TopLevelTarget depends on prerequisites "Target_A Target_D"
, который достаточно просто разобрать, а затем преобразовать в точечный -граф.
Если параметр DEPENDENCY_GRAPH
вообще не установлен или установлен на 0, выходным сигналом является:
Building target foobar.txt
Building target Target_B
Building target Target_A
Building target Target_C
Building target Target_D
Building target TopLevelTarget
или, другими словами, вместо этого используется обычный рецепт сборки. Я еще не проверял, надежно ли это работает со сложными рецептами. Одна проблема, с которой я уже столкнулся, заключается в том, что он вообще не работает с многострочными -рецептами.
Например, в последнем рецепте сборки цели, если в дополнение к тому, что цель создается, я на самом деле хотел touch
файл:
$(VARIABLE_TARGET_NAME) :
$(call getRecipe,\
@echo Building target $@\
touch $@)
make
кажется, что часть touch $@
— это просто часть эха в предыдущей строке:
Building target foobar.txt touch foobar.txt
Если я оставлю обратную косую черту в предыдущей строке,make
жалуется *** unterminated call to function
звонит' :отсутствует )'. Stop.
Если у кого-нибудь есть идеи, как заставить make
вести себя хорошо, я внимательно слушаю.:)
РЕДАКТИРОВАТЬ :Другая проблема с этим подходом заключается в том, что он будет работать только в том случае, если результаты сборки уже не существуют, поскольку make
, очевидно, не выполняет рецепт сборки цели, которую он считает, от -до -. ] Дата.
Я использовал ремейк --профиль(дроп -вместо make
), он сгенерировал дерево зависимостей в формате callgrind.
Затем gprof2dot может сгенерировать образ целевого дерева.
Если вам просто нужно вывести список зависимостей для конкретной цели, вы можете использовать следующую команду:
make -dn MAKE=: you_target | sed -rn "s/^ *Considering target file '(.*)'\.$/\1/p"
MAKE=:
для неработающего ребенка делает .
К сожалению, включены Makefiles. Вы можете отфильтровать их , используя следующий сценарий оболочки(list-deps
):
#!/bin/sh -e
dbg="`make -dn "$@"`"
all="`echo -n "$dbg" | sed -rn "s/^ *Considering target file '(.+)'\.$/\1/p"`"
mks="`echo -n "$dbg" | sed -rn "s/^ *Reading makefile '([^']+)'.*$/\1/p"`"
echo -n "$all" | grep -vxF "$mks"
Теперь вы можете перечислить все зависимости для цели, используя эту команду:
list-deps MAKE=: your_target
Если вам нужно перечислить только те зависимости, которые необходимо переделать, см. этот ответ .