Có đóng cửa sổ terminal mà không thoát khỏi ứng dụng không?


18

Sử dụng Ubuntu 12.04 LTS, câu hỏi của tôi là nếu tôi khởi động một ứng dụng trong cửa sổ đầu cuối, thì có gì xấu khi chỉ đóng cửa sổ đầu cuối mà không thoát khỏi ứng dụng đúng cách trước. Ví dụ, tôi sử dụng MATLAB. Tôi mở một thiết bị đầu cuối và gõ

matlab -nodisplay -nodesktop -nosplash

và sau đó chạy một loạt các kịch bản. Sau đó tôi có thể

exit

để kết thúc MATLAB và sau đó đóng cửa sổ đầu cuối hoặc chỉ đóng cửa sổ đầu cuối. Điều gì thực sự là sự khác biệt giữa hai phương pháp này? Liệu phương pháp thứ hai bằng cách nào đó "làm hại" bất cứ điều gì? Là phương pháp đầu tiên được ưa thích? Tại sao?

Câu trả lời:


22

Nói chung điều này sẽ ổn để làm theo cách này.

Khi bạn nhấp vào "X" để đóng cửa sổ thiết bị đầu cuối, đó là gửi "tín hiệu" từ máy tính để bàn của bạn (Gnome, KDE, v.v.) đến ứng dụng thiết bị đầu cuối, yêu cầu nó tự tắt. Vì bạn đang chạy MATLAB trong trình bao này, nó được coi là một quá trình con cho ứng dụng đầu cuối.

Vì vậy, một phần của trách nhiệm là một quá trình cha mẹ, là bạn lần lượt gửi cùng một "tín hiệu" gần gũi này cho con cái của bạn.

Bây giờ nếu bạn hiểu về khái niệm những gì tôi vừa giải thích thì hãy thay thế một chút về thuật ngữ thực tế.

tín hiệu

Đầu tiên với "tín hiệu", thực sự có cả một nhóm các tín hiệu khác nhau mà bạn có thể gửi đến các quy trình Unix. Để giữ cho nó đơn giản có 4 mà bạn thường sẽ thấy, SIGHUP, SIGTERM, SIGINT, và SIGKILL.

  • ĐĂNG KÍ

    Tín hiệu SIGHUP được gửi đến một quy trình khi thiết bị đầu cuối điều khiển của nó bị đóng. Ban đầu nó được thiết kế để thông báo cho quá trình giảm dòng nối tiếp. Trong các hệ thống hiện đại, tín hiệu này thường có nghĩa là điều khiển thiết bị đầu cuối giả hoặc ảo đã bị đóng.

  • SIGTERM

    Tín hiệu SIGTERM là tín hiệu chung được sử dụng để gây ra sự kết thúc chương trình. Không giống như SIGKILL, tín hiệu này có thể bị chặn, xử lý và bỏ qua. Đó là cách bình thường để lịch sự yêu cầu một chương trình chấm dứt.

  • SIGINT

    Tín hiệu SIGINT (chương trình gián đoạn gián đoạn) được gửi khi người dùng nhập ký tự INTR (thường là Cc).

  • SIGKILL

    Tín hiệu SIGKILL được sử dụng để gây ra sự chấm dứt chương trình ngay lập tức. Nó không thể được xử lý hoặc bỏ qua, và do đó luôn luôn gây tử vong. Nó cũng không thể chặn tín hiệu này.

LƯU Ý: SIGINT là nội dung được gửi khi bạn sử dụng Ctrl+ Cđể "ngắt" chương trình khỏi dòng lệnh trong khi chương trình đang chạy.

cái nào đang được sử dụng?

Rất có thể SIGTERMlà đang được gọi bởi môi trường cửa sổ của bạn và được chuyển xuống thiết bị đầu cuối của bạn. Thiết bị đầu cuối của bạn sau đó rất có thể sau đó gửi SIGHUPxuống MATLAB. Tín hiệu này cung cấp cho tất cả các quy trình cơ hội để thực hiện bất kỳ việc dọn dẹp cục bộ nào (đóng tệp, kết thúc quá trình, v.v.).

lệnh giết

Bạn có thể tự gửi tín hiệu bằng cách sử dụng lệnh có tên kém , kill. Vì vậy, để gửi SIGTERMtín hiệu đến thiết bị đầu cuối của bạn hoặc SIGHUP to MATLAB, you could determine their PID usingps` và sau đó chạy lệnh này để gửi tín hiệu cho họ:

$ kill -SIGTERM <PID>

hoặc này:

$ kill -SIGHUP <PID>

Bạn có thể nhận được một danh sách đầy đủ các tín hiệu bằng lệnh này:

$ kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
...
...

Lưu ý rằng các tín hiệu có số? Bạn sẽ thường xuyên thấy chúng được sử dụng như thế thay vì tên của chúng:

$ kill -15 <PID>

Hoặc khét tiếng -9, có thể giết chết khá nhiều quá trình.


Tôi luôn nghĩ rằng những con số đó là âm, nhưng chúng thực sự là các đối số dòng lệnh. Tôi đã học được một điều mới: D
Thomas

1
HUP - HangUP - là tín hiệu được gửi nếu bạn "mất dòng" cho thiết bị đầu cuối, ví dụ: bạn đã được kết nối với máy chủ Unix bằng modem. Đây có lẽ là tín hiệu "nhẹ nhàng" nhất chấm dứt một quá trình. Hầu hết các trình tiện ích sẽ không thoát nhưng đọc lại tệp cấu hình của chúng trên HUP. Lệnh nohup cho phép bạn để quá trình nền tiếp tục sau khi trình bao đóng. Các lệnh như màn hình tồn tại trong hangout và cách ly các lệnh trong nó từ HUP.
Baard Kopperud

@BaardKopperud - cảm ơn, tôi cố tình bỏ HUP ra, không muốn gây nhầm lẫn cho cuộc thảo luận.
slm

@BaardKopperud - Tôi nghĩ những gì bạn đang chỉ ra là: "Tín hiệu SIGHUP được gửi đến một quy trình khi thiết bị đầu cuối điều khiển của nó bị đóng. Ban đầu nó được thiết kế để thông báo cho quá trình giảm dòng nối tiếp. Trong các hệ thống hiện đại, tín hiệu này thường có nghĩa là việc kiểm soát giả hoặc thiết bị đầu cuối ảo đã bị đóng "Tôi thừa nhận tôi đã nói dối một chút trong mô tả của mình nhưng đã cố gắng giữ cho nó đơn giản.
slm

@BaardKopperud - Tôi cảm thấy có lỗi nên tôi đã sửa đổi câu trả lời của mình để phản ánh chính xác hơn những gì đang diễn ra. Cảm ơn!
slm

2

Rất có thể là ok nhưng bạn sẽ mất dữ liệu tùy thuộc vào những ứng dụng bạn đã mở. Ví dụ: nếu bạn mở trình chỉnh sửa tệp, bạn có thể mất một số thay đổi nếu không lưu và thoát đúng cách. Nếu bạn lo lắng, chỉ cần đăng xuất / thoát thiết bị đầu cuối đúng cách. Nếu bạn không thích gõ exithoặc logoutchỉ thử Ctrl-D.


Tại sao điều đó sẽ tốt hơn? Ứng dụng sẽ nhận được SIGHUP thay vì SIGTERM, nhưng nó vẫn bị giết bởi tín hiệu, vì vậy tôi sẽ không gọi chính xác là "lưu và thoát đúng cách"
Michael Mrozek

Theo như Ctrl-D, điều đó thực sự chỉ áp dụng tại dấu nhắc lệnh.
Đánh dấu
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.