thực hiện một tập lệnh sh từ cron


12

Tôi có một kịch bản test.sh

#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh

Khi tôi thực hiện các tập tin như root từ dòng lệnh, nó hoạt động.

sh /home/v/test.sh 

Khi tôi đặt nó thành crontab -e (là cron gốc), không hoạt động

 * * * * * sh /home/v/test.sh

Tôi làm gì sai? Cảm ơn


"không hoạt động" không hoạt động. Xem? Bạn không biết ý tôi là gì, và likewiese chúng tôi không biết ý của bạn là gì. Ý tôi là (có) cái gì không hiệu quả? Có thể là về bất cứ điều gì. Có thể dự đoán của tmow là chính xác, nhưng đó chỉ là một phỏng đoán (và tôi nghĩ khá tốt, nhưng vẫn vậy).
Jürgen A. Erhard

Có, nếu bạn có thể cụ thể hơn với kết quả bạn đang thấy, chúng tôi sẽ có thể xác định rõ hơn vấn đề là gì. Tức là, ý bạn là "không hoạt động" (:
gabe.

Tôi không thấy bất kỳ nhật ký nào trong syslog và các tập lệnh đang thực hiện một số thao tác chèn vào một db không xảy ra và chúng sẽ rất vui nếu tôi chạy tập lệnh bằng tay.
Elzo Valugi

Câu trả lời:


15

Theo người đàn ông:

Trình nền cron bắt đầu một lớp con từ thư mục HOME của bạn. Nếu bạn lên lịch để chạy lệnh khi bạn chưa đăng nhập và bạn muốn các lệnh trong tệp .profile của mình chạy, lệnh phải đọc rõ ràng tệp .profile của bạn.

Trình nền cron cung cấp một môi trường mặc định cho mọi shell, xác định HOME, LOGNAME, SHELL (= / usr / bin / sh)
và PATH (= / usr / bin).

Vì vậy, cron daemon không biết php ở đâu và bạn nên chỉ định đường dẫn php đầy đủ bằng tay (ví dụ: tôi không biết đường dẫn PHP thực sự của bạn):

#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh

Một cách khác là lấy nguồn / etc / profile (hoặc .profile / .bashrc) của bạn, ví dụ

* * * * * . /home/v/.bashrc ; sh /home/v/test.sh

Điều này hữu ích nếu .bashrc của bạn đặt các biến môi trường mà bạn cần (ví dụ PATH)

BIÊN TẬP

Một cách đọc thú vị là " Newbie: Intro to cron ", đừng đánh giá thấp bài viết từ tiêu đề (Đây là một bài đọc cho mọi người), thực tế nó được viết hoàn chỉnh và trả lời hoàn hảo cho câu hỏi của bạn:

...
PATH chứa các thư mục sẽ nằm trong đường dẫn tìm kiếm cron, ví dụ: nếu bạn có chương trình 'foo' trong thư mục / usr / cog / bin, có thể đáng để thêm / usr / cog / bin vào đường dẫn, vì nó sẽ ngăn bạn phải sử dụng đường dẫn đầy đủ để 'foo' mỗi khi bạn muốn gọi nó.
...


Xấu $ PATH là nguyên nhân phổ biến nhất của các tập lệnh hoạt động bằng tay, nhưng không phải từ cron.
Patrick

@Patrick Tất nhiên đó là một vấn đề nếu cron không biết php ở đâu, nếu không thì Elzo crontab sẽ hoạt động mà không có bất kỳ vấn đề nào, nó PHẢI là một vấn đề PATH.
tmow

Cảm ơn rất nhiều cho câu trả lời của bạn. Nó làm việc cho tôi rất dễ dàng !!! .. Cảm ơn rất nhiều @tmow.
Vignesh Prajapati

5

Có bốn nguyên nhân phổ biến cho các lệnh làm việc khi được nhập vào một thiết bị đầu cuối nhưng không phải từ cron, theo thứ tự phổ biến:

  1. Cron cung cấp một môi trường hạn chế, ví dụ, tối thiểu $PATHvà các biến dự kiến ​​khác bị thiếu.
  2. Cron gọi / bin / sh theo mặc định, trong khi bạn có thể đang sử dụng một số shell khác tương tác.
  3. Cron xử lý đặc biệt% ký tự (nó được chuyển thành dòng mới trong lệnh).
  4. Cron không cung cấp một thiết bị đầu cuối hoặc môi trường đồ họa.

Nếu công việc của bạn tạo ra bất kỳ đầu ra nào, bao gồm các thông báo lỗi, cron sẽ gửi cho bạn một email với toàn bộ đầu ra. Hãy chắc chắn rằng bạn đã đọc thư bạn nhận được tại địa phương hoặc chuyển tiếp đến địa chỉ bạn đã đọc. Để chuyển tiếp thư từ tài khoản cục bộ đến một số địa chỉ khác, hãy đặt địa chỉ khác vào ~/.forward. Nếu công việc định kỳ đang chạy với tư cách là người dùng hệ thống ( root,, webmaster), hãy đảm bảo rằng thư của người dùng được chuyển hướng đến bạn (và bất kỳ quản trị viên nào khác); với hầu hết các thiết lập thư, đặt các dòng như root: elzotrong /etc/aliases.


2

Trình nền cron thường thực thi lệnh của bạn trong một vỏ trong đó biến môi trường PATH bị giới hạn ở một số mặc định của hệ thống, ví dụ / usr / bin: / bin.

Có thể, phplệnh của bạn không có sẵn trong / usr / bin hoặc / bin và do đó tập lệnh thất bại khi được thực thi thông qua cron và chạy thành công khi không.

Cron thường báo cáo lỗi hoặc thông báo công việc qua thư cho người dùng root (tức là khi lệnh trả về trạng thái thoát! = 0 hoặc tạo đầu ra cho thiết bị xuất chuẩn / stderr) sau khi công việc kết thúc.

Tùy thuộc vào hệ thống của bạn, bạn phải thiết lập gửi thư cục bộ để nhận các thư này.

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.