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 follow
sử 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 less
lệnh (dừng lại tailing
), bằng cách nào đó, nó sẽ giết chết máy chủ bắt đầu nohup
từ đầ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 ^C
và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ặcless
dòng trong ngoặc đơn (để biến nó thành một chuỗi con)chạy tập lệnh
xterm
thay vìkonsole
nohup
ngăn quá trình nhận SIGHUP
tín hiệu trong khi CTRL + C gửi SIGINT
tín hiệu. Đó là lý do tại sao nohup
khô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ó?