Tôi có thể chuyển hướng đầu ra đến một tệp nhật ký và làm nền một quá trình cùng một lúc không?


116

Tôi có thể chuyển hướng đầu ra đến một tệp nhật ký và làm nền một quá trình cùng một lúc không?

Nói cách khác, tôi có thể làm một cái gì đó như thế này?

nohup java -jar myProgram.jar 2>&1 > output.log &

Hoặc, đó không phải là một lệnh hợp pháp? Hoặc, tôi có cần phải tự di chuyển nó xuống nền không, như vậy:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1

2
Bạn đã thử chưa? lỗi gì bạn nhận được? Ngoài ra tôi không chắc chắn nếu bạn có một lỗi đánh máy, hoặc một lỗi trong mã của bạn. 2>$1có lẽ là nghĩa vụ phải được 2>&1.
Patrick

Câu trả lời:


171

Một vấn đề với lệnh đầu tiên của bạn là bạn chuyển hướng thiết bị xuất chuẩn đến vị trí xuất chuẩn (nếu bạn thay đổi $ thành a & như được đề xuất trong nhận xét) và sau đó, bạn đã chuyển hướng thiết bị xuất chuẩn sang một số tệp nhật ký, nhưng điều đó không kéo theo thiết bị lỗi được chuyển hướng . Bạn phải thực hiện theo thứ tự khác, trước tiên hãy gửi thiết bị xuất chuẩn đến nơi bạn muốn đến và sau đó gửi thiết bị xuất chuẩn đến địa chỉ thiết bị xuất chuẩn

some_cmd > some_file 2>&1 &

và sau đó bạn có thể ném & vào để gửi nó vào nền. Công việc có thể được truy cập bằng jobslệnh. jobssẽ cho bạn thấy các công việc đang chạy, và đánh số chúng. Sau đó, bạn có thể nói về các công việc bằng cách sử dụng% theo sau là số tương tự kill %1.

Ngoài ra, không có & ở cuối, bạn có thể tạm dừng lệnh với Ctrlz, sử dụng bglệnh để đặt nó ở chế độ nền và fgđưa nó trở lại nền trước. Kết hợp với jobslệnh, điều này là mạnh mẽ.

để làm rõ phần trên về thứ tự bạn viết các lệnh. Giả sử stderr là địa chỉ 1002, stdout là địa chỉ 1001 và tệp là 1008. Lệnh đọc từ trái sang phải, do đó, điều đầu tiên nó nhìn thấy trong 2>&1đó là di chuyển stderr đến địa chỉ 1001, sau đó nó sẽ > filedi chuyển stdout sang 1008, nhưng giữ mức tiêu chuẩn ở mức 1001. Nó không kéo mọi thứ chỉ vào 1001 và chuyển nó sang 1008, mà chỉ tham chiếu thiết bị xuất chuẩn và di chuyển nó vào tệp.
Theo cách khác, nó di chuyển stdout đến 1008, và sau đó di chuyển stderr đến điểm mà stdout đang trỏ tới, 1008. Bằng cách này cả hai có thể trỏ đến tập tin duy nhất.


Dường như không thể bắt được pid sau chuyện này mặc dù với$!
chovy

8
Cũng đáng chú ý: bạn có thể sử dụng &> file.outđể chuyển hướng cả stdin và stdout sang một tệp đầu ra, điều này giúp giảm khả năng xảy ra lỗi khi đặt 2>&1sai vị trí trong dòng lệnh của bạn.
Dan

14

Dừng với <Ctrl+Z>và tiếp tục trong nền với bgtương đương để thực hiện &ở cuối lệnh.

Vì vậy, để chạy trong nền và chuyển hướng đầu ra:

java -jar myProgram.jar 2> errorOutput.log > output.log &

Nếu bạn cũng cần lệnh này không chết khi bạn rời thiết bị đầu cuối, thì bạn nên sử dụng nohup


Ồ tôi hiểu rồi. Bạn đang nói char '&' được nối thêm?
djangofan

Tôi chỉ trích dẫn trang. Vì dù sao nohup cũng sẽ thực thi lệnh trong nền, nên dường như không cần thiết để thực thi nohup trong nền
RSFalcon7

10
nohup không thực thi lệnh trong nền, bạn phải nối thêm một cách rõ ràng&
jlliagre

3
Sau khi bạn di chuyển một tiến trình sang nền bg, bạn có thể tách nó ra khỏi phiên bằng cách chạy disown, điều này làm cho tiến trình đó không chết khi bạn đóng thiết bị đầu cuối.
Koen.

14
java -jar myProgram.jar &> output.log &

Lưu ý rằng &>chỉ đạo cả stdout và stderr tới output.log


3
Một lời giải thích một dòng sẽ làm cho câu trả lời hoàn chỉnh.
anaik

2
@ abhisheknaik96 nó chạy tệp jar và chuyển hướng cả stdin và stderr sang output.log và làm cho nó xử lý nền.
P Pang

2

Thay vì sử dụng nohup bạn có thể sử dụng màn hình. Bạn có thể xem trạng thái của chương trình trong thời gian thực. bạn thậm chí có thể đăng nhập tất cả đầu ra vào một tập tin. Nó rất hữu ích khi bạn truy cập máy chủ qua ssh nơi bạn đăng xuất do kết nối kém hoặc không hoạt động. Sau khi đăng nhập, bạn có thể tiếp tục công việc từ nơi bạn rời đi. tham khảo điều nàyđiều này để biết chi tiết.


1

Các teelệnh là khá phổ biến quá.

nohup java -jar myProgram.jar | tee output.log &

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.