2012-04-04 47 views
5

Chúng tôi có các kịch bản của thiên nhiên sau đây (trong cron)Có cách nào trong một kịch bản shell để tìm ra nơi đầu ra của nó được chuyển hướng?

someScript.sh > /tmp/cronlog/somescript.$(date +%Y%m%d).log 2>&1

Bây giờ là có một cách mà có trong someScript.sh tôi có thể tìm ra những gì các tập tin đầu ra đã đi vào?

Tập lệnh gửi email kèm theo tóm tắt. Đồng thời tôi muốn đề cập đến rằng các chi tiết có thể được tìm thấy trong tập tin đầu ra như vậy và do đó - với trong email.

Tôi biết cấu trúc if [ -t 1 ] để phát hiện stdout v.v ... nhưng cách lấy tên tệp đầu ra? Lưu ý rằng tôi muốn điều này là chung chung để một số người có thể thay đổi tệp đầu ra trong cron và tập lệnh không cần phải sửa đổi.

+1

di chuyển phần email của quá trình để một kịch bản lệnh wrapper gọi 'someScript.sh', kiểm tra xem nó có chạy đúng không và sau đó gửi email được tạo thủ công thích hợp (thành công, cảnh báo hoặc lỗi). ELSE thiết lập một logFile var, export nó, thay thế tmp/... ở trên với $ logFile, dựa vào $ {logFile} bên trong kịch bản lệnh. Chúc may mắn. – shellter

Trả lời

9

Điều đơn giản nhất tôi có thể nghĩ là:

readlink -f /proc/$$/fd/1 

$$ là PID của kịch bản (bên trong kịch bản). Trên hầu hết các hệ thống Unix,/proc/[pid] là thư mục giả chứa thông tin cho quá trình [pid].

/proc/[pid]/fd là một thư mục chứa danh sách các liên kết tượng trưng cho các bộ mô tả tệp mở của quy trình. fd/0 là đầu vào, fd/1 là đầu ra của tập lệnh, v.v.

readlink sau đó cung cấp cho bạn tệp mục tiêu hoặc tty nếu bạn không chuyển hướng đầu ra.

Tất nhiên, nếu bạn muốn hiển thị nó, bạn phải hiển thị nó ở đâu đó khác với tiêu chuẩn ouput, hoặc nó sẽ được chuyển hướng! Để gỡ lỗi, hãy thử lỗi std (2).

kêu gọi khác nhau cho những kết quả trên hộp của tôi (script.sh chỉ gọi readlink -f/proc/$$/fd/1> & 2)

# ./script.sh 
/dev/pts/0 

# ./script.sh > /var/tmp/foo 
/var/tmp/foo 

# ./script.sh | more 
/proc/12132/fd/pipe:[916212] 
+0

Tuyệt vời! Tôi chấp nhận câu trả lời. @huelbois. Tôi ước bạn nhận được nhiều phiếu bầu hơn cho điều này. –

+0

Tôi đang nhận xét vì Linux đã KHÔNG ** trong thẻ ở đây. Tôi không có '/ proc' trên máy Mac của mình. – anubhava

+0

Thanx @ring bearer!Không có nhiều cơ hội để làm việc trên Mac, chỉ 20 ngày trong một dự án đau đớn. Tuy nhiên, bạn có được những điều rất thú vị từ/proc pseudo-filesystem, nó đáng để xem xét nó. – huelbois

4

Thay vì cố gắng tìm một hack (và mà quá phụ thuộc vào nền tảng) nó tốt hơn để có một cách tiếp cận hơi khác nhau ở đây.

Đặt công việc định kỳ của bạn như thế này:

someScript.sh /tmp/cronlog/somescript.$(date +%Y%m%d).log 

nghĩa là không phải và > hoặc 2>&1 (stdout/stderr suối chuyển hướng) và chỉ cần vượt qua một cuộc tranh cãi với mong muốn logfile tên.

Bây giờ bên someScript.sh chuyển hướng dòng để log file của bạn như thế này:

LOGFILE=$1 
exec &>${LOGFILE} 

Và cuối cùng bạn có thể sau đó nhắn khách hàng của bạn rằng:

"output details could be found in ${LOGFILE}" 
Các vấn đề liên quan