Ctrl + c trong một quy trình phụ đang giết chết một quy trình không có trước đó trong tập lệnh


15

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ặc lessdòng trong ngoặc đơn (để biến nó thành một chuỗi con)

  • chạy tập lệnh xtermthay vìkonsole


Ai đó có thể đã gặp vấn đề của tô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ó?
Hashbrown

3
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.
Piotr Dobrogost

Câu trả lời:


11

Tôi đã đúng khi nghĩ rằng nó đã SIGINTđược gửi đến tất cả các quy trình khi ctrl+ c, nhưng tôi thật ngớ ngẩn khi nghĩ rằng thực hiện một quy trình khác sẽ mang nó ra bên ngoài process group(xem những nỗ lực của tôi trong P.P.S.).

Đây không chỉ là trường hợp sử dụng chính xác mà còn là giải pháp chính xác.

Bởi vì cách kịch bản của tôi được cấu trúc, câu trả lời không phù hợp với nguyên văn, đây là kịch bản bây giờ;

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

Máy chủ tiếp tục xuất ra tệp nhật ký sau khi I ctrl+ cin less.

Cảm ơn thời gian của mọi người.


0

Bạn đã thử từ chối ?

  disown -h %1

hoặc bất kể công việc của bạn là gì; disown là một shell được tích hợp sẵn, trang man của nó ghi:

từ chối

từ chối [-ar] [-h] [jobspec ...]

Không có tùy chọn, mỗi jobspec sẽ bị xóa khỏi bảng công việc đang hoạt động. Nếu tùy chọn -h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a 'nor -r' option is supplied, the current job is used. If no jobspec is supplied, the-a' có nghĩa là loại bỏ hoặc đánh dấu tất cả các công việc; tùy chọn `-r 'không có đối số jobspec sẽ hạn chế hoạt động đối với các công việc đang chạy.

BIÊN TẬP

Điều thú vị là công trình của bạn hoạt động trên Arch Linux của tôi:

 $ cat testm
  #!/bin/sh

  nohup /home/mario/temp/waste & 

  less +F out.log

 $ cat waste
  #!/bin/sh

  while [ 1 ]; do
    find / -print 2>1 1> out.log
  done
  $ ./testm
   nohup: appending output to nohup.out
  $ ps ax | grep waste
    19090 pts/2    S      0:00 /bin/sh /home/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

Trước lệnh ps , tôi phải cuộn tệp out.log, sau đó Ctrl+C, sau đó q.


vâng, nhưng tôi không biết làm thế nào để áp dụng nó. Tôi đã cố gắng đặt nohupdòng trong một chức năng mà disownschính nó, nhưng nó sẽ giống như nohup. Tôi không nghĩ đây là một SIGHUPvấn đề, vì khi tôi xóa lessdòng, tập lệnh kết luận với máy chủ vẫn đang chạy
Hashbrown

@Hashbrown vui lòng xem chỉnh sửa của tôi
MariusMatutiae

Vâng, tôi cũng đã thực hiện một thử nghiệm, với một tập lệnh bash đơn giản được gọi thay vì thực thi {SERVER}. Và nohup chỉ hoạt động tốt. Xem bình luận của tôi về câu hỏi. Tôi nghĩ rằng nó có mục đích lắng nghe bằng cách nào đó. Vì máy chủ của nó (và không được biết đến nhiều), tôi thậm chí không thể nói nó là gì để ai đó có thể đi "oh nó đang làm X, bạn cần phải làm Y"
Hashbrown
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.