Как использовать мои псевдонимы в моем crontab?

16

У меня есть некоторые команды, .profileкоторые я хочу вызвать из моего crontab.

Например, если у меня есть,

alias notify-me="~/bin/notify.pl -u user1"
alias notify-team="~/bin/notify.pl -u user1 user2 user3 user4 ...."

Я хотел бы просто вызвать псевдоним

0 11 * * * notify-team

так что если список в моем .profileобновляется, мне тоже не нужно обновлять crontab. Тем не менее, я не могу использовать псевдонимы в моем crontab. Есть ли работа вокруг?

Я попробовал здесь предложения по настройке среды (например, / bin / bash -lc и скрипт script-wrapper). Кажется, что это работает для сценариев, но не псевдонимов.

Есть идеи?

Кит Бентруп
источник
Спасибо всем за полезную информацию. Пара возможных решений, включая мое собственное. В конечном итоге я изменил оригинальную идею Artifex на что-то более полезное для моей ситуации. Крис предоставил необходимую информацию, чтобы сделать это с помощью отдельных сценариев.
Кит Бентруп

Ответы:

10

Из справочной страницы по псевдонимам:

Обратите внимание, псевдонимы не раскрываются по умолчанию в неинтерактивной оболочке,
и это может быть включено, установив 'expand_aliases'
Вариант оболочки с использованием Shopt.

Так что попробуйте использовать shopt -s expand_aliasesв начале вашего сценария поиска. Это должно позволить вам использовать предложение Уорнера.

Кристофер Карел
источник
Это включено для меня на CentOS5 по умолчанию. Классная заметка, хотя.
Warner
Вероятно, не в сценарии, хотя. Попробуйте создать тестовый скрипт, который выводит shopt expand_aliases. Держу пари, что это не так. Это в моей коробке RHEL 5.3.
Кристофер Карел
В точку. +1
Warner
+1 Спасибо за указание на это. Это дает мне большую часть пути к решению, но мне все равно приходится создавать еще один файл. Я надеялся сделать это без этого.
Кит Бентруп
Кит, у меня была та же проблема, но eval 'foo'в crontab все получилось.
Артем Руссаковский
6

bash -c с «источником» должен работать:

0 11 * * * bash -c "source .profile && notify-team"

это может также работать. период означает «источник»

0 11 * * * . .profile && notify-team
Коллин Андерсон
источник
3

Как определил Крис, опция оболочки по умолчанию для неинтерактивных оболочек - не раскрывать псевдонимы. Вот решение, которое я нашел для работы.

Напишите сценарий, включите параметр оболочки и укажите псевдонимы. Будьте особенно внимательны к тому, что .bashrcон получен при исполнении, поэтому он должен быть получен снова после включения expand_aliases.

Мои извинения за изначально неверную рекомендацию. Это было более неясным, чем я первоначально ожидал.

Автор сценария:

#!/bin/bash
shopt -s expand_aliases
source /home/wmoore/.bashrc
notify-team
сигнализатор
источник
Спасибо, но я уже пробовал это. Можете ли вы подтвердить, что он работает в вашей системе? Я также пробовал / bin / bash -lc source ~ / .profile; notify-team и другие варианты. Также я предпочитаю не иметь отдельный скрипт для каждого псевдонима. Это побеждает цель избежать дублирования.
Кит Бентруп
Я должен был включить ошибку из crontab: «команда не найдена» во все варианты, которые я пробовал.
Кит Бентруп
Отредактировано с проверенной рекомендацией.
Warner
Спасибо за обновленный пример. Я думаю, что если вы добавите -l к первой строке, вы сможете избавиться от третьей.
Кит Бентруп
Ах, хороший вызов - в оболочке входа в систему будет включена функция expand_aliases.
Warner
1

Мне нравится идея Artifex извлечь псевдоним из файла и затем использовать его повторно, поскольку я не смог найти способ расширения / повторного использования псевдонимов напрямую. (Другие решения все еще требовали другого сценария.)

Поэтому я написал эту функцию и поместил ее в свой .profile:

grab-alias () { sed -n '/alias\s*'$1'\s*=/ {s/[^'\'']*.//;s/'\''\s*$//p}' /home/bentrupk/.profile; }

Затем я смог использовать его в моем crontab для различных псевдонимов, например:

0 11 * * * /bin/bash -lc 'x=`grab-alias notify-team`; $x'
0 7 * * * /bin/bash -lc 'x=`grab-alias notify-me`; $x'

и т.п.

Ух, повторное использование кода! Спасибо всем.

Кит Бентруп
источник
3
это чистое зло.
Джастин
Если бы я мог использовать псевдоним напрямую, я бы. В этом суть вопроса. Вы можете предложить другое решение, но я возьму это решение поверх множества файлов из 2-3 строк, загромождающих каталог - что произойдет, когда я добавлю дополнительные схемы уведомлений или решу повторно использовать некоторые из моих других псевдонимов.
Кит Бентруп
1

На самом деле самое простое, что вы могли бы сделать, это создать

~ / bin / notify-me with

#!/bin/sh
~/bin/notify.pl -u user1

~ / bin / notify-team with

#!/bin/sh
~/bin/notify.pl -u user1 user2 user3 user4 ....

Как вы видели, псевдонимы оболочки сложно поддерживать и интегрировать в другие системы. Лучше всего превратить их в полноценные команды, которые не будут вызывать смешных проблем с окружением.

Джастин
источник
1
Спасибо за предложение, но я никогда не думал, что псевдонимы трудно поддерживать, и я предпочел бы сохранить 1 файл псевдонимов, а затем поддерживать множество файлов-оболочек. Проблема заключалась в выполнении псевдонимов в задании cron.
Кит Бентруп
0

bash -ic "notify-team" - лучший вариант. Это делает псевдоним доступным в crontab. Вы также можете добавить & для фона, так как мы используем «интерактивную» оболочку с -i, но в действительности не взаимодействуем с ней.

SuperGeek
источник
-2
0 11 * * * bash -ic "notify-team" > /log/file

работает для меня

vakhrymchuk
источник
1
Некоторое объяснение улучшило бы ответ
Дэйв М