Как выполнить функцию с утилитой “At”?

Скажите, что мне назвали этот файл сценария pma.sh:

#!/bin/bash

apt-get install phpmyadmin -y

function uninstpma {

apt-get purge phpmyadmin -y

}

uninstpma ()

Запускать весь скрипт с at Я мог сделать ./pma.sh | at 'now + 2 minuts'. Но я не хочу это для всего сценария; Скорее только для функции в сценарии. Так:

Как я мог запланировать только функцию с at утилита?

1
задан 3 January 2017 в 07:26

1 ответ

Если Вы можете, переместить функциональные определения в отдельный файл "библиотеки".

Если приемлемо отредактировать сценарий, то лучшее решение состоит в том, чтобы, вероятно, переместить функциональные определения из сценария в отдельный файл. Тот файл, содержа функциональные определения, будет затем получен сценарием (а также удаление функций из сценария, необходимо будет добавить команду к сценарию, который делает это), и также тем, что другой сценарий или управляет, чтобы Вы работали с at.

Например, прямо сейчас Ваш pma.sh взгляды что-то как:

!#/bin/bash

apt-get install phpmyadmin -y

function uninstpma {
    apt-get purge phpmyadmin -y
}

uninstpma

(Ваш исходный сценарий был отформатирован по-другому и также имел uninstpma () как его последняя строка. Списки аргументов, пустые или иначе, не включаются в круглые скобки в оболочках стиля Границы. И, по крайней мере, в ударе 4.3.46 в моей системе, это не принято как альтернативный синтаксис. Таким образом, я принял () была ошибка и удалила его.)

Вы могли создать новый файл, названный чем-то как pma_funcs.sh - можно назвать его вообще, Вам нравится - который содержит:

function uninstpma {
    apt-get purge phpmyadmin -y
}

Это может также содержать дополнительные функциональные определения.

Это имеет нет #!/bin/bash строка hashbang, и это не должно быть отмечено исполняемый файл также, потому что это не будет выполняться как автономный сценарий. Вместо этого это будет в действительности использоваться в качестве библиотеки для других сценариев.

Все вызывающие стороны сначала получат файл с функциональными определениями.

Предположим, что Вы помещаете pma.sh в a /opt/pma-helpers каталог. (Я не говорю, что это - то, куда необходимо поместить его - это очень вероятно не лучшее место - я просто должен был выбрать что-то.) Вы затем изменили бы pma.sh:

!#/bin/bash

. /opt/pma-helpers/pma_funcs.sh

apt-get install phpmyadmin -y

uninstpma

. встроенные источники Ваш сценарий, в котором должно быть сказано это, заставляет оболочку выполнять все команды в файле, передали как его аргумент (/opt/pma-helpers/pma_funcs.sh). Так как подоболочка не создается для выполнения их (см. этот вопрос и что один), команды, которые определяют новые переменные, и функции вступают в силу для вызывающей стороны. (Что вызывающая сторона является сценарием, который работал ., не независимо от того, что сценарий выполнил его, если таковые имеются, если тот другой сценарий не использовал . также.)

Затем когда необходимо изменить функцию, у Вас есть только одна копия для редактирования - та в pma_funcs.sh. Новая версия будет определена в экземплярах оболочки, которые имеют . /opt/pma-helpers/pma_funcs.sh с тех пор pma_funcs.sh был обновлен.

Необходимо получить файл, который содержит функциональные определения перед использованием функции но Вы не должны делать так в самом верху Вашего сценария (если следующая строка не использует одного из них).

Вызывать одну из этих функций при выполнении at, Вы получите сценарий в коде, выполненном at.

Ваши потребности примера кода bash, но at выполнения управляют с sh.

В данном случае, однако, существует дополнительная сложность это at запускает скрипты с /bin/sh, которым в Ubuntu обеспечивают dash, нет bash, но Ваш сценарий использует определенную для Bash функцию, не поддерживавшую более основными из оболочек POSIX как Тире.

(Функция function name compound-command синтаксис для определения функций. Как все совместимые POSIX оболочки, Тире делает функции поддержки, но только со стандартом name () compound-command синтаксис. Поддержки Bash, что также, поэтому если это - единственная определенная для Bash функция, Вы используете, затем Вы могли бы просто переключиться на стандартный синтаксис. Я предполагаю, что это не единственное, которое Вы планируете использовать, тем не менее, так как Bash предлагает много других удобных расширений, которые менее тривиальны для замены.)

Поэтому необходимо сильно рассмотреть создание сценария Bash и планирование того сценария с at. Предположим, что Вы сделали этот сценарий в задании /opt/pma-helpers/pma_job. (Снова, у меня нет причины думать, что это - разумное место для помещения его на систему. Необходимо поместить его где-нибудь, который имеет смысл для того, что Вы делаете.) Этот файл мог содержать:

#!/bin/bash
# any commands here must not use the functions; they're not sourced yet
. /opt/pma-helpers/pma_funcs.sh
# you can put commands here if you want
uninstpma
# you can put commands here, too, if you want

Mark исполняемый файл сценария (chmod u+x /opt/pma-helpers/pma_job, принятие в задании должно быть выполнено как владелец сценария). Затем когда Вы захотите запланировать его, Вы сделаете в задании, состоящем из единственной команды, которая запускает тот скрипт:

at 'now + 2 minutes' <<<'/home/ek/source/pma_job'

(Я использовал здесь строка в команде, которая вызывает at.)

Задание не должно входить в специализированный файл сценария, если Вы действительно не хотите его к.

Ваш сценарий Bash сможет получить и выполнить все функции оболочки, записанные в Bash. Однако, если по некоторым причинам Вы действительно не хотите запускать отдельный скрипт, затем у Вас действительно есть другие опции. Что-либо гарантирующее Ваши зависимые от удара функции оболочки определяется и используется в оболочке удара, достаточно.

Например, Вы могли использовать вложенный здесь документы:

at now <<'EOF'
bash - <<'EOF_BASH'
# any commands here must not use the functions; they're not sourced yet
. /opt/pma-helpers/pma_funcs.sh
# you can put commands here if you want
uninstpma
# you can put commands here, too, if you want
EOF_BASH
EOF

Это немного сложно. Вы - вероятно, более обеспеченное наличие что дополнительный pma_job сценарий.

1
ответ дан 7 December 2019 в 15:42

Другие вопросы по тегам:

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