Tôi có một chương trình tạo ra thông tin hữu ích stdout
nhưng cũng đọc từ đó stdin
. Tôi muốn chuyển hướng đầu ra tiêu chuẩn của nó sang một tệp mà không cung cấp bất cứ điều gì về đầu vào tiêu chuẩn. Cho đến nay, rất tốt: tôi có thể làm:
program > output
và đừng làm bất cứ điều gì trong tty.
Tuy nhiên, vấn đề là tôi muốn làm điều này trong nền. Nếu tôi làm:
program > output &
chương trình sẽ bị treo ("bị treo (đầu vào tty)").
Nếu tôi làm:
program < /dev/null > output &
chương trình chấm dứt ngay lập tức vì nó đạt EOF.
Dường như những gì tôi cần là đưa vào program
thứ gì đó không làm gì trong một khoảng thời gian không xác định và không đọc stdin
. Các phương pháp sau đây hoạt động:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Tuy nhiên, đây là tất cả rất xấu xí. Phải có một cách thanh lịch, sử dụng các tiện ích Unix tiêu chuẩn, để "không làm gì, vô thời hạn" (để diễn giải man true
). Làm thế nào tôi có thể đạt được điều này? (Tiêu chí chính của tôi về sự thanh lịch ở đây: không có tệp tạm thời; không có sự thức dậy bận rộn hoặc chờ đợi định kỳ; không có tiện ích kỳ lạ; càng ngắn càng tốt.)
su -c 'while true; do true; done | cat > ~/output &' user
?
1<&-
nó sẽ thoát khỏi chương trình của bạn?
su -c 'program | output &' user
. Tôi sắp hỏi một câu hỏi tương tự với việc tạo các công việc nền như một phương pháp có thể chấp nhận để xử lý "dịch vụ / trình nền". Tôi cũng nhận thấy rằng tôi không thể chuyển hướngSTDERR
mà không chuyển hướngSTDOUT
. Giải pháp mà chương trìnhA gửiSTDOUT
đếnSTDIN
chương trìnhB, sau đó chuyển hướngSTDERR
đến tệp nhật ký:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null