Как использовать мои псевдонимы в моем 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, но в действительности не взаимодействуем с ней.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.