Tôi không biết liệu điều này có thuộc về SO hay không (vì đây là lỗi mã hóa) nhưng tôi nghĩ các bạn sẽ hiểu biết nhiều hơn về sự tinh tế của phần mềm được sử dụng (vì vậy thậm chí có thể xem xét cả U & L).
Đây là tập lệnh mã tối thiểu (xem các chỉnh sửa cho tập lệnh đầy đủ, có một lý do tôi thực hiện theo cách này);
#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
Những gì nó cố gắng làm là chạy một máy chủ ở chế độ nền, xuất ra tệp nhật ký.
Sau đó tôi followsử dụng tệp nhật ký less +F. Khi bạn làm như vậy, để thoát khỏi điều này, bạn phải nhấn ctrl+ ctrước khi bạn có thể nhấn Q.
Điều gì xảy ra là, khi tôi ctrl+ cbên trong lesslệnh (dừng lại tailing), bằng cách nào đó, nó sẽ giết chết máy chủ bắt đầu nohuptừ đầu! Không có gì khác bị ảnh hưởng. Tôi có thể shift+ fđể bắt đầu theo dõi nhật ký một lần nữa (không nhận được thông tin mới kể từ khi máy chủ bị giết) và nếu tôi nhấn Qphần còn lại của tập lệnh thì thực thi bình thường.
Bạn có biết tại sao điều này xảy ra? Làm thế nào để tránh nó / cái gì khác tôi nên sử dụng?
PS
Chương trình máy chủ có thể đang lắng nghe ^C, đây có thể là vấn đề; tôi có thể làm gì để ngăn chặn điều đó? Giống như, khi tôi tự chạy {SERVERCOMMAND}(theo cách chặn), tôi có thể đánh ctrl+ c, mà không giết nó ngay lập tức; nó in Received ^C signal, shutting down(và sau đó tự giết chết). Đây là những gì xảy ra khi tôi ^Cvào less(Một trận chung kết Received ^C signal, shutting downđược ghi vào nhật ký).
PPS
Tôi đã thử một số thứ (không có gì hoạt động);
cố gắng ngắt kết nối stdin khỏi tập lệnh bằng cách thay đổi
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 & to nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 & or nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &sử dụng
stty intr ^Gđể thay thế lệnh ngắt, nhưng sau đó ctrl+ gđã thực hiện chính xác những gì^Cđang làm (vì vậy đây có thể là một vấn đề với trình giả lập thiết bị đầu cuối của tôi;konsole)đặt
nohup& / hoặclessdòng trong ngoặc đơn (để biến nó thành một chuỗi con)chạy tập lệnh
xtermthay vìkonsole
nohupngăn quá trình nhận SIGHUPtín hiệu trong khi CTRL + C gửi SIGINTtín hiệu. Đó là lý do tại sao nohupkhông có hiệu quả bạn mong đợi.
I think it is due to the handling within the database software, not on the shell. Làm thế nào một chương trình sẽ làm điều này? Làm thế nào, sau đó, tôi có thể ngăn chặn nó?