Câu hỏi chuyển hướng đầu ra nohup sang một tệp khác


tôi sử dụng nohup khá thường xuyên cho các quy trình chạy dài quan trọng trong linux/bash, quá nhiều để mà nohup time my command with arguments && mv nohup.out my.log gần như là một thành ngữ đối với tôi.

Vấn đề là ở đó nohup đặt cả hai stdout và stderr vào nohup.outvà tôi không thể kiểm soát tên của tệp. Điều này có nghĩa là nếu tôi vô tình bắt đầu hai nohuptrong cùng một thư mục, đầu ra của chúng sẽ được xen kẽ trong nohup.out.

Các câu hỏi là:

  1. Làm cách nào để giải quyết vấn đề này? Luôn luôn chạy nohups trong các thư mục riêng biệt và viết một hàm vỏ mà trước tiên sẽ kiểm tra ./nohup.out là hai lựa chọn sucky tôi thấy.

  2. Làm thế nào đến tôi không thể nói nohup.out nơi để chuyển hướng đầu ra? Các công cụ GNU có xu hướng có rất nhiều tùy chọn, tại sao không nohup?


4
2018-02-14 15:38


gốc




Các câu trả lời:


Bạn có thể chuyển hướng cả stdout và stderr vào một tệp. Với Bash 4 (hoặc những thứ khác như Zsh), dễ dàng như:

nohup <some-command> &> output.log

Tôi không thể cho bạn biết tại sao không có tùy chọn riêng cho nohup để đặt đầu ra, nhưng nếu trình bao của bạn có thể xử lý điều đó, bạn không thực sự cần một tùy chọn.


6
2018-02-14 15:44



Nó có ngăn không nohup từ thực hiện chuyển hướng riêng của nó? - grawity
GNU nohup nói rằng nó sẽ chuyển hướng stdout tới một tệp nếu bạn chỉ định nohup command > file. BSD nohup không đề cập đến điều này ở tất cả, nhưng nó đã làm việc cho tôi. - slhck
GNU nohup nói rằng nó sẽ chuyển hướng stdout tới một tệp nếu bạn chỉ định nohup command > file Không chuyển hướng trong trường hợp nohup command > file được xử lý bởi vỏ và không nohup? Nếu có thì làm thế nào có thể nohup thực hiện bất kỳ hành động nào dựa trên chuyển hướng thời tiết có hiện diện hay không? - Piotr Dobrogost
Tập tin nohup.out cũng sẽ được tạo trong trường hợp đầu ra lỗi; nhưng nếu bạn chuyển hướng cả hai stdout và stderr, không thể có bất kỳ đầu ra, do đó, các tập tin sẽ không được tạo ra. Nhưng &> cú pháp không tuân thủ POSIX; bạn tốt hơn với câu trả lời của Irshad Khan ở nơi khác trên trang này. - tripleee


Đến Nối đầu ra trong tệp do người dùng xác định bạn có thể dùng >> trong lệnh nohup.

nohup php your_command >> filename.out 2>&1 &

Lệnh này sẽ nối thêm tất cả đầu ra trong tệp của bạn mà không xóa dữ liệu cũ.


4
2017-08-18 15:10



Và nếu bạn muốn ghi đè tệp đầu ra bằng POSIX sh cú pháp, điều đó đơn giản nohup your_command >filename.out 2>&1 & - tripleee


Có nhiều cách hơn là chỉ nohup để bắt đầu một quá trình để nó bỏ qua SIGHUP; ví dụ: (được viết dưới dạng hàm vỏ)

nohup() {
    setsid "$@"
}

nohup() {
    ("$@" &)
}

nohup() {
    "$@" & disown
}

(setsid, hoặc thậm chí (setsid "$@" &), có thể là lựa chọn tốt nhất.)

Tất cả chúng đều cho phép bạn chỉ định các chuyển hướng của riêng bạn >, 2>&>/>&.


3
2018-02-14 15:48