Làm thế nào để ngăn chặn ứng dụng được khởi chạy trong Terminal khỏi thoát không mong muốn?


10

Tôi khởi chạy các ứng dụng từ Terminal với các lệnh như thế này:

/Applications/Mail.app/Contents/MacOS/Mail &

Phần quan trọng là  &.

  • Đối với Unix / Linux / Solaris:

    • Tôi đã học được ở trường rằng thêm  &chương trình làm cho chương trình sống một mình.
    • Tôi nhớ rất rõ việc khởi chạy một lệnh như thế nào  xeyes &và để chương trình chạy an toàn ngay cả khi tôi đóng vỏ.
  • Trên Mac OS X (Unix bên trong):

    1. Tôi khởi chạy một ứng dụng  &và tôi đóng cửa sổ Terminal: ứng dụng thoát!
    2. Tại sao hành vi không mong muốn này xảy ra trên Mac OS X?
    3. Làm thế nào để sửa cái này ?

Câu trả lời:


7

Cách "chuẩn" để thực hiện những gì bạn muốn thực hiện (trên OS X cũng như trên Linux, FreeBSD hoặc các hệ thống khác) là sử dụng lệnh nohup:

nohup program &

Điều này sẽ bắt đầu program, nó sẽ chạy trong nền so với shell vì &- và sẽ bỏ qua các tín hiệu gác máy do lệnh nohup.

Bằng cách này, chương trình sẽ tiếp tục chạy ngay cả khi bạn đóng vỏ. Sẽ không có vấn đề gì nếu bạn đóng vỏ vì bạn đang đóng Terminal.app hoặc bạn đang đóng vỏ vì bạn đang ngắt kết nối từ ssh với máy tính hoặc tương tự.


1
Điều này tạo ra một tập tin nohup.outtrong thư mục hiện tại. Ngay cả khi không có gì để viết. Sau một vài tuần, tôi sẽ có các tệp nohup.outở mọi nơi trong máy Mac của mình. :-(
Nicolas Barbulesco

1
@NicolasBarbulesco Sử dụng nohup command>/dev/null&hoặc command&disown.
Lri

6

Khi bạn đóng một cửa sổ đầu cuối, nó sẽ gửi SIGHUP (tín hiệu gác máy) đến trình bao, sau đó gửi SIGHUP tới tất cả các quy trình mà nó đã bắt đầu . Đây là hành vi truyền thống cho bash và nhiều shell khác, và giải pháp truyền thống cho việc này là sử dụng nohup.

Có nhiều cách mà các máy Unix khác nhau có thể khác nhau, vì vậy có thể các trình giả lập thiết bị đầu cuối cụ thể mà bạn đã sử dụng hoặc các trình bao cụ thể mà bạn đã sử dụng khác nhau. Nhưng nó không dành riêng cho OS X. Ví dụ, có một câu hỏi về vấn đề tương tự trên Ubuntu.


6

Sử dụng ký hiệu " &", bạn đang nói với Terminal để chạy quy trình trong nền của chính trình bao. Do đó, khi bạn đóng shell (và hủy tiến trình), GUI (chính Mail.app) cũng sẽ đóng.

Lệnh chính xác để khởi chạy Mail từ thiết bị đầu cuối chỉ đơn giản là:

open -a Mail; exit

Chỉnh sửa: Tôi vừa tìm thấy điều này tại U & L Stack Exchange: Ampersand có nghĩa là gì ở cuối dòng script shell? Các câu trả lời được cung cấp là tuyệt vời và giải thích chính xác những gì đang diễn ra chi tiết hơn và tốt hơn bao giờ hết! Tôi rất khuyên bạn nên đọc qua nó.


Điều gì về việc chuyển thông số dòng lệnh cho ứng dụng? Như thế này:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco

2
@NicolasBarbulesco Đó là một câu hỏi riêng biệt - hãy xem trang hướng dẫn để mở và tôi nghĩ một câu hỏi ở đây
user151019

Điều gì về việc khởi chạy một ứng dụng cụ thể, không phải trong /Applications, nhưng tại một đường dẫn cụ thể? Như thế này:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco

@NicolasBarbulesco mở [đường dẫn đầy đủ] hoặc cd vào thư mục và mở [tệp]. Bạn có thể sử dụng ~ / cho thư mục nhà của mình và ký tự đặc biệt, "dấu hoa thị", vì ký hiệu ngắn hơn giả sử không có chuỗi nào khác khớp với giá trị, IE: ~ / De * / Fire * ... et cetera. Hoặc chỉ cần viết một tập lệnh đơn giản: cat> nameofscript ..... #! / bin / sh .... mở [đường dẫn đầy đủ] .... ^ D ..... chmod + x nameofscript ...... \ nameofscript .... và tùy chọn, mv nameofscript $ PATH / yourpersonalbin. Người đàn ông đọc sách không thích mở. Đó là một mệnh lệnh đơn giản và như một mệnh lệnh đơn giản, sự đánh đổi là nó không mạnh đến thế.
njboot

1
Xin lỗi, vẫn cần sử dụng đối số -a:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot

3

@jksoegaard có các lệnh thích hợp nhưng như bạn đã đề cập trong bình luận, nó tạo ra tệp nohup.out. Để ngăn tập tin nohup.out được tạo, bạn cần chuyển hướng STDOUT và STDERR ở một nơi khác. Lệnh hoàn chỉnh sẽ là nohup program &>/dev/null &. Điều này sẽ chạy chương trình của bạn trong nền, bỏ qua SIGHUP và gửi tất cả STDOUT và STDERR tới / dev / null.

Tuy nhiên, nếu bạn không nhớ thêm nohup (như trong câu hỏi ban đầu của bạn), bạn có thể sử dụng disown -arhlệnh để đánh dấu tất cả các công việc đang chạy nền để bỏ qua SIGHUP.


Câu trả lời tốt đẹp, nhưng vẫn còn phức tạp. Và hình ảnh hồ sơ đẹp. :-)
Nicolas Barbulesco

3

Tôi đã tìm được giải pháp :

(/Applications/Mail.app/Contents/MacOS/Mail &)

Nó là đơn giản, nó là đẹp, và nó hoạt động!

Các dấu ngoặc đơn  ( )khởi chạy lệnh trong một vỏ con.


- và & trả về từ chương trình vào trình bao mà không cần chờ đợi, vì vậy bạn có thể tiếp tục sử dụng trình bao hoặc chấm dứt chương trình mà không cần chương trình bạn bắt đầu thoát.
r_alex_hall

0

Hoặc bạn có thể thử open -a /Applications/Mail.app

Cách sử dụng: mở [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s] [- b] [-a] [tên tập tin] [- đối số]
Trợ giúp: Mở mở tệp từ vỏ.
      Theo mặc định, mở từng tệp bằng ứng dụng mặc định cho tệp đó.
      Nếu tệp ở dạng URL, tệp sẽ được mở dưới dạng URL.
Tùy chọn:
      -a Mở với ứng dụng được chỉ định.
      -b Mở bằng mã định danh gói ứng dụng đã chỉ định.
      -e Mở bằng TextEdit.
      -t Mở bằng trình soạn thảo văn bản mặc định.
      -f Đọc đầu vào từ đầu vào tiêu chuẩn và mở bằng TextEdit.
      -F --fresh Khởi chạy ứng dụng mới, nghĩa là không cần khôi phục các cửa sổ. Trạng thái lưu liên tục đã bị mất, không bao gồm các tài liệu Chưa có tiêu đề.
      -R, --reveal Chọn trong Finder thay vì mở.
      -W, --wait-apps Chặn cho đến khi các ứng dụng đã sử dụng bị đóng (ngay cả khi chúng đang chạy).
          --args Tất cả các đối số còn lại được truyền trong argv đến hàm main () của ứng dụng thay vì mở.
      -n, --new Mở một phiên bản mới của ứng dụng ngay cả khi ứng dụng đang chạy.
      -j, - DA Ra mắt ứng dụng ẩn.
      -g, --background Không đưa ứng dụng lên nền trước.
      -h, --header Tìm kiếm vị trí tệp tiêu đề cho các tiêu đề khớp với tên tệp đã cho và mở chúng.
      -s Đối với -h, SDK sẽ sử dụng; nếu được cung cấp, chỉ các SDK có tên chứa giá trị đối số được tìm kiếm.
                        Mặt khác, SDK phiên bản cao nhất trong mỗi nền tảng được sử dụng.

-2

Tôi đã tìm ra một giải pháp: chiến đấu với cái ác với cái ác.

Tôi khởi chạy ứng dụng của mình với loại lệnh này:

/Applications/Mail.app/Contents/MacOS/Mail & exit

Vỏ thoát ra cùng một lúc. Và ứng dụng vẫn tồn tại, ngay cả sau khi tôi đóng cửa sổ Terminal.

Nhưng giải pháp này không tiện dụng lắm.


1
Bạn thực sự nên mở Ứng dụng đi kèm với mở . Đó là bằng chứng trong tương lai khi nội dung gói thay đổi cũng như chính tắc.
Ian C.

@Ian - Ở đây tôi đặc biệt quan tâm đến việc mở các ứng dụng đang ở một đường dẫn cụ thể, không vào /Applicationsvà không đi kèm với máy Mac của tôi.
Nicolas Barbulesco

1
.appcác thư mục được gọi là "gói" và openlệnh có thể khởi chạy chúng cho dù chúng nằm trong /Applicationsthư mục hoặc bất kỳ thư mục nào khác. Thuật ngữ "gói" trong ngữ cảnh này không có nghĩa là "vận chuyển với OS X".
không ai là

mở cũng giống như nhấp vào biểu tượng. Nó không giống với việc khởi chạy ứng dụng từ dòng lệnh như OP yêu cầu.
Ted Bigham
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.