2010-01-18 35 views
5

Tôi muốn biết làm thế nào tôi có thể xác định nếu một kịch bản python được thực hiện từ crontab?Làm cách nào để xác định xem tập lệnh python được thực thi từ crontab?

Tôi không muốn một giải pháp yêu cầu thêm thông số vì tôi muốn có thể phát hiện điều này ngay cả từ mô-đun đã nhập (không phải tập lệnh chính).

+2

tại sao bạn muốn biết điều này? – SilentGhost

+1

Ví dụ tôi muốn thay đổi cách nó thực hiện đầu ra. Khi chạy từ thiết bị đầu cuối tôi muốn sử dụng màu thông qua trình tự thoát ANSI nhưng khi chạy từ thiết bị đầu cuối, tôi muốn văn bản thuần túy để nhận được email đẹp. – sorin

+3

Sau đó kiểm tra thiết bị đầu cuối, không phải cho cron. – digitalarbeiter

Trả lời

19

Không hoàn toàn là những gì bạn đã hỏi, nhưng có lẽ những gì bạn muốn là os.isatty(sys.stdout.fileno()), cho biết nếu stdout được kết nối với (nói gần) một thiết bị đầu cuối. Nó sẽ là sai nếu bạn đường ống đầu ra vào một tập tin hoặc quá trình khác, hoặc nếu quá trình này được chạy từ cron.

+1

+1 Điều này sẽ là điều đúng đắn nếu bạn muốn sản lượng khác nhau dựa trên việc bạn có xuất ra 'màn hình' hay không. –

+3

** 'sys.stdout.isatty()' ** đơn giản hơn 'os.isatty (sys.stdout.fileno())'. –

7

Kiểm tra PPID - ID của quy trình gốc. So sánh với cron pid; Nếu chúng giống nhau, nó được gọi bởi crontab.

này có thể được thực hiện bằng cách:

$ sudo ps -Af | grep cron | grep -v grep 
root 6363 1 0 10:17 ? 00:00:00 /usr/sbin/cron 

Các PID của tiến trình cron trong ví dụ này là 6363. Điều đáng nói đến là PPID của cron là 1-the init process.

Bây giờ tìm ra PID của chương trình python của bạn là gì:

$ sudo ps -Af | grep SorinSbarnea.py 
adam 12992 6363 1 12:24 pts/2 00:04:21 /usr/bin/python SorinSbarnea.py 

PID của nó là 12.992 và PPID là 6363, vì vậy nó đã thực sự gọi bởi quá trình cron.

EDIT:

Quá trình cron có thể không gọi quá trình của bạn trực tiếp. Do đó, bạn sẽ phải đi qua các PPID từ quá trình của bạn trở lên, cho đến khi đạt PPID = 1 hoặc PPID = /usr/sbin/cron 's PID. Điều này có thể dễ dàng được thực hiện bằng cách sử dụng một kịch bản shell hoặc python nhỏ; chỉ phân tích đầu ra của ps:

$ cat /proc/12992/status 
.... 
Pid: 12992 
PPid: 7238 
Uid: 1000 1000 1000 1000 
Gid: 1000 1000 1000 1000 
... 

Bước tiếp theo sẽ là checkig/proc/7238, v.v. Một lần nữa, Điều này thực sự dễ thực hiện bằng cách sử dụng kịch bản lệnh shell hoặc python.

Xin cảm ơn, @digitalarbeiter và @Noufal Ibrahim đã chỉ ra điều đó trong nhận xét của bạn.

+3

cron sẽ chạy mục nhập crontab của bạn trong một trình bao mới, đây sẽ là PPID của tập lệnh Python của bạn. Bạn cần so sánh PPID của PPID. – digitalarbeiter

+2

Điều này giả định rằng cha mẹ (cron) trực tiếp sinh ra con mà không có một vỏ hoặc cái gì khác ở giữa. Không phải lúc nào cũng đúng. –

4

Đặt biến môi trường tại lời gọi lệnh cron. Điều đó hoạt động ngay cả trong một mô-đun, vì bạn chỉ có thể kiểm tra os.getenv().

2

Cách khắc phục dễ dàng hơn là chuyển một cờ cho tập lệnh chỉ từ crontab, như --crontab, và sau đó chỉ cần kiểm tra cờ đó.

+2

nhưng anh ấy không muốn làm điều đó. –

0

Nếu bạn muốn phát hiện điều này từ mô-đun đã nhập, tôi sẽ có chương trình chính đặt biến toàn cục trong mô-đun, điều này sẽ tạo ra những thứ khác nhau tùy thuộc vào giá trị của biến toàn cục này (và có chương trình chính quyết định cách thức để đặt biến thông qua một lá cờ mà bạn sẽ sử dụng trong crontab của bạn). Điều này khá mạnh (so sánh với việc nghiên cứu PPID).

Các vấn đề liên quan