Là một biện pháp phòng ngừa cho sự bất tiện khi phải nhấn CTRL- z, bạn có thể tạo một tập lệnh bao bọc cho trình soạn thảo để chạy trình soạn thảo của bạn trong nền. Bằng cách này, bạn sẽ không cần phải nhớ để bắt đầu nó trong nền một cách rõ ràng:
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
Ở trên trước tiên chúng tôi cố gắng xác định xem bạn có máy chủ X khả dụng không và chỉ sau đó chạy trình chỉnh sửa ở chế độ nền (nếu không, nhiều trình soạn thảo Unix sẽ sử dụng thiết bị đầu cuối của bạn và bạn không muốn chạy trình chỉnh sửa làm tiến trình nền trong trường hợp này) . Nó sẽ chuyển tất cả các đối số cho trình soạn thảo của bạn về nguyên văn lựa chọn ( "$@"
) giống như bạn đã cung cấp cho tập lệnh trình bao bọc.
Đối với lệnh bạn đang thiếu ... Theo thử nghiệm cơ bản của tôi, đối với các chương trình GUI không liên quan đến thiết bị đầu cuối, nó có thể đơn giản như lần gửi đầu tiên SIGSTOP
và sau đó SIGCONT
đến quy trình nền trước (sử dụng kill
lệnh nếu bạn sử dụng tập lệnh shell để thực hiện điều này) . Tất nhiên, bạn sẽ cần phải chạy nó trong một cửa sổ / tab thiết bị đầu cuối khác, và khó khăn sẽ là thuận tiện và theo cách chung chung để tìm ra PID mà bạn muốn gửi tín hiệu của mình. Theo mặc định, bạn có thể gửi hai tín hiệu cho tất cả các quy trình của tên đã cho (mặc định cho trình soạn thảo yêu thích của bạn và cũng cho phép sử dụng PID làm đối số):
#!/bin/sh
EDITOR=emacs # whatever
stop_cont_prog()
{
case "$1" in
# begin with number is considered PID - this is not good
# enough to be taken seriously...
[1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
*) killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
esac
}
if [ -n "$1" ]; then
for prog in "$@"; do stop_cont_prog "$1"; done
else
stop_cont_prog "${EDITOR}"
fi
Phương pháp này chính xác đã cho tôi các tab thiết bị đầu cuối của tôi cho tôi sau khi chạy (một số) emacs
lệnh trong nền. Nhưng quá trình emacs chạy trong thiết bị đầu cuối không được khôi phục đúng cách do điều khiển công việc shell hoặc nhầm lẫn cài đặt thiết bị đầu cuối. Vì vậy, phương pháp này sẽ được hưởng lợi từ một số tinh vi.
Đây SIGSTOP
chính xác là những gì được gửi đến quá trình tiền cảnh khi bạn nhấn (theo mặc định chung) CTRL- z. Tham khảo stty -a
đầu ra
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(viết tắt đầu ra) và stty
trang hướng dẫn:
susp CHAR
CHAR will send a terminal stop signal
Quá trình dừng sử dụng SIGSTOP
tín hiệu có thể được khởi động lại bằng cách gửi SIGCONT
. Thông thường, logic điều khiển công việc shell sẽ gửi SIGCONT
và xử lý các thao tác cần thiết khác liên quan đến fg
và bg
các lệnh mà chúng ta bỏ qua.
tmux
cung cấp các chức năng như mong muốn trong câu hỏi của bạn.