Nohup không ghi nhật ký vào tập tin đầu ra


141

Tôi đang sử dụng lệnh sau để chạy tập lệnh python trong nền:

nohup ./cmd.py > cmd.log &

Nhưng có vẻ như nohup không ghi bất cứ điều gì vào tệp nhật ký. cmd.log được tạo nhưng luôn trống. Trong kịch bản python, tôi đang sử dụng sys.stdout.writethay vì printin ra đầu ra tiêu chuẩn. Tôi có làm gì sai không?


Bạn nohupđang sử dụng biến thể nào ? Phiên bản BSD ghi vào một tệp được gọi nohup.outtrong thư mục hiện tại (hoặc $HOME/nohup.outnếu thư mục hiện tại không thể ghi được). Tôi không thấy cách thay đổi tên tệp đầu ra ...
wulong

@wulong Điều đó chỉ khi thiết bị xuất chuẩn là thiết bị đầu cuối.
John Kugelman

Tôi cũng đã thử lệnh mà không chuyển hướng và nó không tạo ra tệp nohup.out. Tôi không biết đó là biến thể nào nhưng tôi đang dùng SunOS 5.10 nếu điều đó có ích.

Câu trả lời:


103

Có vẻ như bạn cần phải xả stdout định kỳ (ví dụ sys.stdout.flush()). Trong thử nghiệm của tôi, Python không tự động làm điều này ngay cả printkhi chương trình thoát ra.


17
python cũng như các chương trình dựa trên C stdio khác sử dụng bộ đệm dòng trong trường hợp tương tác (thiết bị xuất chuẩn được kết nối với tty) và bộ đệm khối khi được chuyển hướng đến một tệp. Nếu python -ukhông hoạt động; nohupcó thể đã giới thiệu bộ đệm của riêng mình.
jfs

12
@JFSebastian Cho đến hôm nay, nohupkhông có đầu ra bộ đệm và python -uchỉ hoạt động tốt. (chỉ là bản cập nhật cho mọi người)
Pijusn

1
@Pius: nohuplà một tiện ích POSIX có thể có các triển khai khác nhau trên các nền tảng khác nhau. btw, python3 I / O không còn dựa trên C stdio nhưng nó có hành vi đệm tương tự.
JFS

381

Bạn có thể chạy Python với -ucờ để tránh bộ đệm đầu ra:

nohup python -u ./cmd.py > cmd.log &

12
Điều này tốt hơn! Cảm ơn rất nhiều :)
Sadjad

@kommradHomer Tôi đoán nó phụ thuộc vào lượng đầu ra trên thiết bị xuất chuẩn / thiết bị xuất chuẩn mà chương trình của bạn tạo ra.
vz0

1
Hoạt động như một lá bùa. Tôi cũng nghĩ rằng đó là một câu trả lời tốt hơn câu trả lời đúng. Bạn có thể vui lòng đánh dấu điều này là chính xác để không nhầm lẫn người khác?
Ondrej Burkert

1
Cảnh báo: không phải lúc nào cũng hoạt động . Tôi không biết tại sao. Phải không
Basj

3
đây sẽ là câu trả lời được chấp nhận ... đã làm những gì tôi muốn. cảm ơn!
krinker

42
  • Sử dụng -u với nohuplàm việc cho tôi. Sử dụng -usẽ buộc các luồng stdout, stderrkhông được đệm. Nó sẽ không ảnh hưởng đến stdin. Mọi thứ sẽ được lưu trong tập tin " nohup.out ". Như thế này-

    nohup python -u your_code.py &

    Bạn cũng có thể lưu nó vào thư mục của bạn. Cách này-

    nohup python -u your_code.py > your_directory/nohup.out &
  • Ngoài ra, bạn có thể sử dụng PYTHONUNBUFFERED. Nếu bạn đặt nó thành một chuỗi không trống, nó sẽ hoạt động giống như -utùy chọn. Để sử dụng lệnh này chạy bên dưới các lệnh trước khi chạy mã python.

    export PYTHONUNBUFFERED=1

    hoặc là

    export PYTHONUNBUFFERED=TRUE

PS- Tôi sẽ đề nghị sử dụng các công cụ như cron-job để chạy mọi thứ trong nền và thực hiện theo lịch trình.


Có gì khác với câu trả lời từ @ vz0?
De Khánh

1
@De Khánh không có gì khác biệt.
Mã hóa


2

Python 3.3 trở lên có một đối số tuôn ra để in và đây là phương pháp duy nhất phù hợp với tôi.

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)

0

Tôi đã có một vấn đề tương tự, nhưng không được kết nối với một quá trình Python. Tôi đang chạy một kịch bản không hoạt động và kịch bản chạy định kỳ qua cron.

Tôi đã có thể giải quyết vấn đề bằng cách:

  1. chuyển hướng stdin, stdout và stderr
  2. đảm bảo tập lệnh được gọi qua nohup không chạy bất cứ thứ gì khác trong nền

PS: kịch bản của tôi đã được viết bằng ksh chạy trên RHEL

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.