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


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.