Як використовувати мої псевдоніми в моєму кронтабі?


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 та скрипт-обгортка сценарію). Схоже, це працює для сценаріїв, але не псевдонімів.

Будь-які ідеї?


Дякую, всім за корисну інформацію. Тут є кілька можливих рішень, включаючи моє власне. В кінцевому рахунку я змінив оригінальну ідею artifex на щось більш корисне для моєї ситуації. Кріс надав необхідну інформацію, щоб зробити це окремими сценаріями.
Кіт Бентруп

Відповіді:


10

На сторінці з псевдонімами:

Зауважте, псевдоніми не розширюються за замовчуванням у неінтерактивній оболонці,
і це можна ввімкнути, встановивши "expand_aliases"
варіант оболонки за допомогою shopt.

Тому спробуйте використовувати shopt -s expand_aliasesна початку сценарію пошуку. Це дозволить вам використовувати пропозицію Warner.


Це увімкнено для мене на CentOS5 за замовчуванням. Хоча класна примітка.
Уорнер

Напевно, не за сценарієм. Спробуйте створити тестовий сценарій, який виводить shopt expand_aliases. Б'юсь об заклад, що це вимкнено. Це в моєму вікні RHEL 5.3.
Крістофер Карел

Ти вдарився цвяхом по голові. +1
Warner

+1 Thx для вказівки на це. Це дає мені більшу частину шляху до рішення, але я все-таки мушу створити інший файл. Я сподівався обійтися без цього.
Кіт Бентруп

Кіт, у мене було те саме питання, але займаючись eval 'foo'crontab зробив свою справу .
Артем Русаковський,

6

bash -c з "source" має працювати:

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

це також може спрацювати. період означає "джерело"

0 11 * * * . .profile && notify-team

3

Як визначив Кріс, опція оболонки за замовчуванням для неінтерактивних оболонок полягає в тому, щоб не розширювати псевдоніми. Ось я знайшов рішення.

Напишіть сценарій, увімкніть параметр оболонки та вкажіть псевдоніми. Будьте особливо обізнані про те, що .bashrcджерело виконується під час виконання, саме тому його потрібно знову отримати після ввімкнення розширення_aliases.

Вибачте за спочатку неправильну рекомендацію. Це було більш незрозуміло, ніж я спочатку очікував.

Сценарій:

#!/bin/bash
shopt -s expand_aliases
source /home/wmoore/.bashrc
notify-team

Thx, але я це вже пробував. Чи можете ви підтвердити, що він працює у вашій системі? Я також спробував / bin / bash -lc source ~ / .profile; команда сповіщень та інші варіанти. Також я вважаю за краще не мати окремого сценарію для кожного псевдоніма. Це перемагає мету уникнути дублювання.
Кіт Бентруп

Я повинен був включити помилку з crontab: "команда не знайдена" у всіх варіантах, які я намагався.
Кіт Бентруп

Відредаговано з перевіреною рекомендацією.
Warner

Thx для оновленого прикладу. Я думаю, якщо ви додасте -l у свій перший рядок, ви зможете позбутися свого 3-го.
Кіт Бентруп

Ах, хороший виклик - оболонка входу буде включена.
Уорнер

1

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

Тому я написав цю функцію і помістив її у свій .profile:

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

Тоді я зміг використати його в моєму кронтабеті для різних псевдонімів, таких як:

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 с

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

~ / bin / notify-team з

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

Псевдонії оболонки складно підтримувати та інтегрувати в інші системи, як ви вже бачили. найкраще зробити, це перетворити їх на повноцінні команди, які не матимуть смішних проблем із оточенням.


1
Дякую за пропозицію, але я ніколи не думав, що псевдоніми важко підтримувати, і я вважаю за краще підтримувати 1 файл псевдонімів, а потім підтримувати багато файлів обгортки. Проблема полягала у виконанні псевдонімів у роботі cron.
Кіт Бентруп

0

bash -ic "сповістити команду" - найкращий варіант. Це робить псевдонім доступним у кронтабі. Ви можете додатково додати & для фону, оскільки ми використовуємо 'інтерактивну' оболонку з -i, але насправді не взаємодіємо з нею.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.