Làm thế nào để sử dụng bí danh của tôi trong crontab của tôi?


16

Tôi có một số lệnh trong tôi .profilemà tôi muốn gọi từ tôi crontab.

Ví dụ, nếu tôi có,

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

Tôi chỉ muốn gọi bí danh

0 11 * * * notify-team

vì vậy nếu danh sách trong tôi .profileđược cập nhật, tôi cũng không phải cập nhật crontab. Tuy nhiên, tôi dường như không thể sử dụng bí danh trong tôi crontab. Có một công việc xung quanh?

Tôi đã thử các đề xuất ở đây để thiết lập môi trường (ví dụ / bin / bash -lc và tập lệnh bao bọc tập lệnh). Có vẻ như nó hoạt động cho các kịch bản nhưng không phải bí danh.

Có ý kiến ​​gì không?


Cảm ơn, tất cả cho các thông tin hữu ích. Vài giải pháp có thể ở đây bao gồm cả của riêng tôi. Cuối cùng tôi đã sửa đổi ý tưởng ban đầu của artifex thành một cái gì đó hữu ích hơn cho tình huống của tôi. Chris cung cấp thông tin cần thiết để làm điều đó với các kịch bản riêng biệt.
Keith Bentrup

Câu trả lời:


10

Từ trang hướng dẫn về bí danh:

Các bí danh lưu ý không được mở rộng theo mặc định trong vỏ không tương tác,
và nó có thể được kích hoạt bằng cách đặt 'extend_aliases'
tùy chọn shell sử dụng shopt.

Vì vậy, hãy thử sử dụng shopt -s expand_aliaseskhi bắt đầu kịch bản tìm nguồn cung ứng của bạn. Điều này sẽ cho phép bạn sử dụng đề xuất của Warner.


Đây là bật cho tôi trên CentOS5 theo mặc định. Mặc dù lưu ý mát mẻ.
Warner

Có lẽ không phải trong một kịch bản, mặc dù. Hãy thử tạo một kịch bản thử nghiệm mà đầu ra shopt expand_aliases. Tôi đang đặt cược nó đi. Nó nằm trong hộp RHEL 5.3 của tôi.
Christopher Karel

Anh nói trúng phóc. +1
Warner

+1 Thx để chỉ ra điều này. Nó đưa tôi đến hầu hết các giải pháp, nhưng cuối cùng tôi vẫn phải tạo một tệp khác. Tôi đã hy vọng để làm điều đó mà không có điều đó.
Keith Bentrup

Keith, tôi đã có cùng một vấn đề nhưng làm eval 'foo'trong crontab đã làm điều đó.
Artem Russakovskii

6

bash -c với "nguồn" sẽ hoạt động:

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

điều này cũng có thể làm việc giai đoạn có nghĩa là "nguồn"

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

3

Như Chris đã xác định, tùy chọn shell mặc định cho các shell không tương tác là không mở rộng bí danh. Đây là một giải pháp tôi đã tìm thấy để làm việc.

Viết một kịch bản, kích hoạt tùy chọn shell và nguồn bí danh của bạn. Đặc biệt lưu ý rằng .bashrccó nguồn gốc khi thực hiện, đó là lý do tại sao nó phải được lấy lại sau khi kích hoạt extend_aliases.

Tôi xin lỗi cho các khuyến nghị ban đầu không chính xác. Điều này tối nghĩa hơn tôi dự kiến ​​ban đầu.

Kịch bản:

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

Thx, nhưng tôi đã thử nó rồi. Bạn có thể xác nhận rằng nó hoạt động trên hệ thống của bạn? Tôi cũng đã thử / bin / bash -lc source ~ / .profile; đội thông báo và các biến thể khác. Ngoài ra tôi không muốn có một tập lệnh riêng cho mỗi bí danh. Điều đó đánh bại mục đích tránh trùng lặp.
Keith Bentrup

Tôi nên bao gồm lỗi từ crontab: "không tìm thấy lệnh" trên mọi biến thể mà tôi đã thử.
Keith Bentrup

Chỉnh sửa với một khuyến nghị thử nghiệm.
Warner

Thx cho ví dụ cập nhật. Tôi nghĩ rằng nếu bạn thêm -l vào dòng thứ 1 của bạn, bạn có thể thoát khỏi dòng thứ 3 của mình.
Keith Bentrup

À, cuộc gọi tốt-- shell đăng nhập sẽ được mở rộng_aliases.
Warner

1

Tôi thích ý tưởng của artifex về việc lấy bí danh từ tệp và sau đó sử dụng lại, vì tôi không thể tìm cách mở rộng / tái sử dụng bí danh trực tiếp. (Các giải pháp khác vẫn cần một kịch bản khác.)

Vì vậy, tôi đã viết hàm này và đặt nó vào .profile của mình:

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

Sau đó, tôi đã có thể sử dụng nó trong crontab của mình cho nhiều bí danh như thế này:

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

Vân vân.

Yay, sử dụng lại mã! Cảm ơn tất cả.


3
đó là tà ác.
Justin

Nếu tôi có thể sử dụng bí danh trực tiếp, tôi sẽ. Đó là điểm của câu hỏi. Bạn có thể đề xuất một giải pháp khác, nhưng tôi sẽ đưa giải pháp này qua rất nhiều tệp 2-3 dòng làm lộn xộn một thư mục - đó là điều sẽ xảy ra khi tôi thêm các lược đồ thông báo bổ sung hoặc quyết định sử dụng lại một số bí danh khác của mình.
Keith Bentrup

1

Thực sự điều đơn giản nhất bạn có thể làm là tạo ra

~ / bin / thông báo cho tôi với

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

~ / bin / đội thông báo với

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

bí danh shell rất phức tạp để duy trì và tích hợp vào các hệ thống khác, như bạn đã thấy. điều tốt nhất để làm là biến chúng thành các lệnh đầy đủ mà sẽ không có vấn đề môi trường buồn cười.


1
Cảm ơn vì đã gợi ý, nhưng tôi chưa bao giờ nghĩ bí danh là khó duy trì và tôi muốn duy trì 1 tệp bí danh sau đó duy trì nhiều tệp bao bọc. Vấn đề là thực thi các bí danh trong một công việc định kỳ.
Keith Bentrup

0

bash -ic "đội thông báo" là lựa chọn tốt nhất. Nó làm cho bí danh có sẵn trong crontab. Bạn có thể thêm một & cho nền vì chúng tôi đang sử dụng trình bao 'tương tác' với -i, nhưng thực tế không tương tác với nó.


-2
0 11 * * * bash -ic "notify-team" > /log/file

làm việc cho tôi


1
Một số lời giải thích sẽ cải thiện câu trả lời
Dave M
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.