Điểm:0

Chạy một lệnh ở chế độ nền, nhưng nhận được mã thoát khác không *ngay lập tức* khi `Không có tệp hoặc thư mục như vậy`

lá cờ cn

Tôi cần chạy một số lệnh (không xác định) trong nền như thế này:

Nohup some_command &

Vì một lệnh như vậy sẽ chạy và (hy vọng) hoàn thành ở chế độ nền, nên tôi không thể nhận được trạng thái thoát của nó ngay lập tức; được thôi.

Tuy nhiên, tôi cần có trạng thái thoát "lỗi" ngay lập tức trong trường hợp đó some_command không tìm thấy (nghĩa là khi thông báo lỗi từ bash là Không có tập tin hoặc thư mục hoặc lệnh không tìm thấy).

Đâu là giải pháp thay thế ngắn nhất và đơn giản nhất mà tôi có thể sử dụng?


Một số thông tin cơ bản cho các câu hỏi được hỏi trong các ý kiến: Đây là chương trình "giao diện người dùng" GUI tương tác với người dùng. Người dùng nhập một số lệnh (ví dụ: gedit some_file) và chương trình GUI của tôi thực thi lệnh này và ngay lập tức quay lại vòng lặp để chấp nhận lệnh tiếp theo từ người dùng. Vì vậy, lệnh đã nhập sẽ chạy "tách rời" khỏi chương trình GUI. Tuy nhiên, nếu người dùng nhập sai lệnh nào đó (ví dụ: geditxyz) Tôi muốn thông báo ngay cho người dùng rằng không tìm thấy lệnh.

lá cờ ar
Bạn có cần sử dụng cả `nohup` ở đầu và `&` ở cuối không? Nó sẽ hoạt động nếu bạn sử dụng cái này hay cái kia?
raj avatar
lá cờ cn
raj
Bằng cách "lấy" trạng thái thoát, bạn có nghĩa là lấy nó theo chương trình (để sử dụng sau này trong tập lệnh) hay chỉ để nó hiển thị trên thiết bị đầu cuối? Bởi vì trong trường hợp thứ hai, bash sẽ tự làm điều đó nếu bạn đặt `set -b`. Hãy thử gõ `nohup không tồn tại &` và bạn ngay lập tức nhận được kết quả như `[1]+ Thoát 127 không tồn tại`.
Điểm:3
lá cờ cn

Vì một lệnh như vậy sẽ chạy và (hy vọng) hoàn tất ở chế độ nền, nên tôi không thể nhận được trạng thái thoát của nó; được thôi.

Tuyên bố này là không chính xác để bắt đầu với:

#!/bin/bash
some_command &
pid = "$!"
đợi -n "$pid"
echo "Trạng thái là ${?}."

Nếu bạn muốn được thông báo ngay lập tức, bạn có thể sử dụng một vài thủ thuật dựa trên tín hiệu.

Xử lý SIGCHLD sẽ là lựa chọn rõ ràng nhất, nhưng (1) hỗ trợ của nó trong Bash là lỗi và (2) mặc dù đặt -b, bẩy trình xử lý sẽ thực sự đợi ranh giới lệnh.

Điều đó nói rằng, tùy chọn tốt nhất tiếp theo (cũng làm gián đoạn quá trình xử lý tiền cảnh kéo dài ngay lập tức khi nào some_command fail) là (tương đương với) tạo Ctrl+C cho toàn bộ nhóm quy trình của bạn. Điều này được phân phối và thực hiện ngay lập tức, bản thân shell có thể xử lý tín hiệu và tiếp tục, nếu muốn, trong khi quy trình nền trước có lẽ sẽ thoát theo mặc định, v.v.

#!/bin/bash
đặt -e

trình xử lý () {
  tiếng vang 'báo hiệu lỗi lệnh'
  bẫy - INT
}
xử lý bẫy INT

lai lịch() {
  cục bộ -ir pid="$1"
  sự thay đổi
  "$@" || giết -INT -- -"$pid"
}
nền "$$" some_command &

# nhiệm vụ tiền cảnh chạy dài
echo 'trước khi xử lý lâu'
ngủ 5|| echo 'xử lý lâu bị gián đoạn'
echo 'sau khi xử lý lâu'

Cố gắng thay thế some_command với (ví dụ.) ngủ 2 để kiểm tra trường hợp âthành côngâ.

FedKad avatar
lá cờ cn
Cảm ơn vì câu trả lời. Nó rất gần với những gì tôi cần, nhưng vẫn "hơi phức tạp". Ngoài ra, tôi đã làm rõ tuyên bố trước đó của mình bằng cách thêm từ **ngay lập tức**.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.