Giả sử tôi khởi chạy một loạt các quy trình từ phiên ssh. Có thể chấm dứt phiên ssh trong khi vẫn giữ các tiến trình đó chạy trên máy từ xa không?
Giả sử tôi khởi chạy một loạt các quy trình từ phiên ssh. Có thể chấm dứt phiên ssh trong khi vẫn giữ các tiến trình đó chạy trên máy từ xa không?
Câu trả lời:
Bạn nên tìm kiếm sự thay thế hiện đại như thế nào tmux
.
tmux
vượt trội hơn screen
vì nhiều lý do, đây chỉ là một số ví dụ:
Để có được chức năng tương tự như được giải thích trong câu trả lời khuyến nghị screen
, bạn cần thực hiện như sau:
tmux
bằng cách gõ tmux
vào vỏtmux
phiên bắt đầutmux
phiên bằng cách gõ Ctrl+ bvà sau đód Bây giờ bạn có thể đăng xuất an toàn từ máy từ xa, quy trình của bạn sẽ tiếp tục chạy bên trong tmux
. Khi bạn quay lại lần nữa và muốn kiểm tra trạng thái của quy trình, bạn có thể sử dụng tmux attach
để đính kèm vào tmux
phiên của mình .
Nếu bạn muốn có nhiều phiên chạy song song, bạn nên đặt tên cho mỗi phiên bằng Ctrl+ bvà $
. Bạn có thể nhận danh sách các phiên hiện đang chạy bằng cách sử dụng tmux list-sessions
, bây giờ đính kèm vào phiên đang chạy bằng lệnh tmux attach-session -t 0
.
tmux
có thể làm những việc cao cấp hơn nhiều so với xử lý một cửa sổ trong một phiên duy nhất. Để biết thêm thông tin, hãy xem man tmux
hoặc trang GmHub của tmux . Cụ thể, đây là một Câu hỏi thường gặp về sự khác biệt chính giữa screen
và tmux
.
screen -x -r [screenname]
hoặc screen -rx
viết tắt nếu bạn chỉ có một phiên màn hình hoạt động. Điều này cho phép bạn đính kèm một phiên bản màn hình hiện có.
Ctrl-b
và sau đó d
để rời / tách tmux
phiên. Chắc chắn đó là trường hợp của phiên bản tmux
trên Ubuntu 12.04 của tôi.
tmux detach
thay vì gõctrl-b d
nohup
Cách tốt nhất thường là đơn giản nhất.
nohup long-running-command &
Nó được làm riêng cho việc này, nó thậm chí còn ghi lại thiết bị xuất chuẩn nohup.log
.
man nohup
bg
Nếu bạn muốn "làm nền" một số tác vụ đã chạy, thì cách tốt nhất của bạn là Ctrl+ Zsau đó chạy
bg
để đặt tác vụ bị treo gần đây nhất của bạn xuống nền, cho phép nó tiếp tục chạy.
Sau đó, nhanh chóng disown
giữ cho quá trình chạy sau khi bạn đăng xuất.
screen
và những người khác có thể làm điều đó, nhưng đó không phải là những gì họ làm. Tôi khuyên bạn nên thực hiện nohup
các nhiệm vụ mà bạn biết rằng bạn sẽ bỏ lại phía sau và bg
cho các nhiệm vụ bạn đang chạy và không muốn bắt đầu lại.
Hãy ghi nhớ, cả hai đều là bash cụ thể. Nếu bạn không sử dụng bash, thì các lệnh có thể khác.
disown -h
bg
+ disown
không làm việc cho tôi. Tôi đã có một kịch bản triển khai đang chạy Tôi quên bắt đầu bên trong tmux và cần phải rời đi sớm cho một cuộc họp. Kịch bản liên tục xuất tiến trình sang trình bao. ctrl+z
dừng quá trình, trả lại cho tôi bash. bg
đã tiếp tục quá trình, nhưng nó cũng tiếp tục xuất ra trạng thái bash, làm cho không thể thấy những gì tôi đang gõ. Tuy nhiên, một disown
lệnh tạo ra "disown: current: không có công việc như vậy"
julia myFile.jl
vì bất cứ lý do gì. tmux làm và là tuyệt vời.
Bạn có thể làm điều đó bằng cách sử dụng screen
.
Nhập man screen
để tìm hiểu thêm hoặc đọc trang man màn hình này .
Kịch bản đơn giản:
ssh vào hộp từ xa của bạn. Gõ screen
Sau đó bắt đầu quá trình bạn muốn.
Nhấn Ctrl- Asau đó Ctrl- D. Điều này sẽ "tách" phiên màn hình của bạn nhưng để các tiến trình của bạn chạy. Bây giờ bạn có thể đăng xuất khỏi hộp từ xa.
Nếu bạn muốn quay lại sau, hãy đăng nhập lại và gõ screen -r
Điều này sẽ "tiếp tục" phiên màn hình của bạn và bạn có thể thấy đầu ra của quy trình của mình.
screen -S name
để dễ dàng kết nối với phiên chính xác hơn sau này.
screen -S
trước khi rời đi và screen -r
khi trở lại là tuyệt vời!
Màn hình và nohup là cách tốt hơn, nhưng nếu bạn phải tách một quá trình đã chạy mà không có màn hình hoặc nohup, bạn có thể chạy lệnh disown.
disown [-ar] [-h] [
jobspec
… |
pid
… ]
Không có tùy chọn, loại bỏ từng jobspec khỏi bảng công việc đang hoạt động. Nếu
-h
tùy chọn được đưa ra, công việc sẽ không bị xóa khỏi bảng, nhưng được đánh dấu để SIGHUP không được gửi đến công việc nếu shell nhận được SIGHUP. Nếu jobspec không có mặt và cả tùy chọn-a
cũng không-r
được cung cấp, công việc hiện tại sẽ được sử dụng. Nếu không có jobspec được cung cấp,-a
tùy chọn có nghĩa là loại bỏ hoặc đánh dấu tất cả các công việc; các-r
tùy chọn mà không một JOBSPEC luận hạn chế hoạt động để chạy việc làm.
Khi không sử dụng, bạn có thể đóng thiết bị đầu cuối và chạy quy trình trên máy.
disown -a && exit
disown
và nó đã giết nó.
Tôi bị kẹt trong một mv lớn vì vậy tôi không ở vị trí dừng quá trình, thiết lập màn hình và sau đó bắt đầu lại. Tôi đã quản lý để thoát phiên ssh với quy trình đang chạy bằng cách thực hiện các bước sau:
Bước 3 tạm dừng quy trình hiện tại (ví dụ: lệnh 'mv' của tôi).
Bước 4 đặt quá trình tạm dừng vào nền và tiếp tục lại.
Bước 5 cho phép bạn từ chối quá trình. ** Để có được một danh sách các công việc chỉ cần gõ jobs
trước.
** Về việc từ chối (từ hướng dẫn sử dụng bash):
disown [-ar] [-h] [jobspec ... | pid ... ]
Without options, remove each jobspec from the table of active
jobs. If jobspec is not present, and neither the -a nor the -r
option is supplied, the current job is used. If the -h option
is given, each jobspec 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 no jobspec is supplied, the -a option
means to remove or mark all jobs; the -r option without a job‐
spec argument restricts operation to running jobs. The return
value is 0 unless a jobspec does not specify a valid job.
disown
, lệnh tích hợp sẽ hoạt động trên công việc nền gần đây nhất.
Có hai chương trình chính bạn có thể sử dụng để duy trì chương trình và trạng thái đầu cuối trên nhiều kết nối ssh. Chúng là màn hình (đương nhiệm, nhưng không may là không rõ ràng. Rõ ràng hiện đang được tích cực phát triển ) và tmux (mới hơn, được duy trì tích cực). Byobu là một giao diện người dùng có thể chạy trên các hệ thống này và cung cấp thêm thông tin trạng thái ubfox. Trên các bản cài đặt mới, nó sẽ sử dụng tmux làm phần phụ trợ, nếu bạn có bản cài đặt cũ hơn của byobu và một cấu hình hiện có, nó sẽ duy trì phần phụ trợ trước đó, có thể là màn hình hoặc tmux.
Byobu có thể được cài đặt trên máy tính bằng cách thực hiện trong máy dựa trên Debian:
sudo aptitude install byobu
Sử dụng yum, bạn làm
su -c 'yum install byobu'
Cũng có thể cài đặt byobu trên các bản phân phối khác.
Bạn có thể bắt đầu byobu bằng cách chạy byobu
trên máy chủ sau khi kết nối bằng ssh. Điều này sẽ cung cấp cho bạn một vỏ trông như thế này:
Bạn cũng có thể sử dụng Byobu Terminal trên máy Ubuntu với tùy chọn -X và dễ dàng có một byobu hoạt động hoàn hảo.
Bắt đầu byobu bằng cách gõ byobu
.
Bạn có thể nhấn F2 để tạo một cửa sổ mới trong phiên hiện tại, F3-F4 để chuyển giữa các cửa sổ khác nhau.
Phần tốt nhất về byobu là, bạn không thực sự phải giết các tiến trình đang chạy trong thiết bị đầu cuối để rời khỏi thiết bị đầu cuối. Bạn chỉ có thể gửi screen / tmux (bộ xương của byobu) đến nền và tiếp tục lại vào lần tới:
Lần tới khi bạn đến, chỉ cần làm byobu
và bạn sẽ quay lại ngay nơi bạn đang ở.
Bạn cũng có thể tạo các phiên byobu khác nhau byobu -S session1
và cứ thế. Và bạn có thể kết nối với một trong số họ khi bạn quay lại.
Bạn có thể làm nhiều hơn nữa bằng cách sử dụng Byobu. Sử dụng nó! Một số hướng dẫn dứt khoát là ở đây , hoặc ở đây .
Bạn không thể làm điều này một khi quá trình đã bắt đầu, bạn cần phải thiết lập mọi thứ trước khi bạn thực hiện một công việc dài.
Bạn có thể sử dụng nohup nhưng trí tuệ hiện đại cho thấy bạn sử dụng màn hình hoặc byobu làm thông tin đăng nhập để bạn có thể tách ra và để mọi thứ chạy.
Màn hình có lợi thế là bạn có thể tách rời khỏi một máy và gắn lại từ một máy khác, điều này rất tiện lợi nếu bạn muốn kiểm tra các quy trình chạy dài chạy quá cuối ngày làm việc.
Có một hướng dẫn bắt đầu hợp lý để sàng lọc ở đây.
byobu đặt một giao diện dễ sử dụng lên trên màn hình với các menu, v.v ... Đó cũng là cách triển khai màn hình hiện tại trên Ubuntu mới hơn. F2 để bắt đầu một thiết bị đầu cuối F3 / F4 mới để chuyển đổi qua lại và F6 để ngắt kết nối. Gõ exit để thực sự kết thúc thiết bị đầu cuối vĩnh viễn.
disown
để đạt được điều này. Xem câu trả lời của @ bassgey
disown
và nếu chỉ cần Ctrl-z
, sau đó bg
để có được nó của thiết bị đầu cuối hoạt động và nền. Sau đó , disown
.
Này, trong khi tôi đồng ý rằng màn hình là lựa chọn hoàn hảo nhất. Bạn có thể sử dụng vncserver và sau đó bắt đầu quá trình trên nó.
Ngoài ra nếu giao diện duy nhất của bạn là có quy trình đang chạy và không cần kiểm soát lại nó, và điều quan trọng nhất là bạn không biết bạn sẽ cần phải đóng phiên và bạn đã có quy trình đang chạy, bạn sẽ không gặp may nếu bạn đã sử dụng bash làm vỏ
Trước tiên, bạn cần gửi quy trình đến nền bằng cách nhập Ctrl + Z theo sau là bg% 1 (số phụ thuộc vào số công việc, thường là 1, nhưng bạn có thể dễ dàng kéo danh sách bằng cách sử dụng lệnh job)
Cuối cùng gọi lệnh disown (tiếp theo là jobid ... giống như với lệnh bg)
Điều này sẽ loại bỏ mối quan hệ cha-con giữa vỏ của bạn và quá trình trong nền, ngăn nó chết khi vỏ của bạn bị chấm dứt.
screen
, câu hỏi được đặt ra sau sự kiện đăng nhập, làm thế nào để giữ cho các quy trình hoạt động, bây giờ sau khi đăng nhập nhưng trước khi bắt đầu chúng. Câu trả lời tuyệt vời, bạn đã thực sự giúp tôi! :)
bg
(không có %1
) thường là đủ, vì mặc định là công việc hiện tại
Đối với một tập lệnh shell duy nhất mà tôi đã chạy trong một thời gian dài, tôi sẽ đăng nhập và chạy quy trình trong nền bằng cách sử dụng '&'.
Thí dụ:
/path/to/my/script &
Tôi đã đăng xuất và ngắt kết nối phiên SSH của mình. Khi tôi đăng nhập một thời gian sau đó, tập lệnh vẫn đang thực thi như được chứng minh bằng cách thu thập dữ liệu liên tục từ tập lệnh.
&
nếu bạn đăng xuất và đăng nhập vào phiên SSH, quy trình sẽ vẫn chạy tuy nhiên bạn sẽ không thể thấy đầu ra của quy trình đó (nếu tập lệnh của bạn lặp lại một cái gì đó sẽ không nhìn thấy nó, nhưng nếu nó ghi một tập tin thì tập tin sẽ ở đó)
Bạn nên kiểm tra GNU Screen và xem nó có giúp gì cho bạn không. Tùy thuộc vào cách bạn cần ứng dụng của bạn chạy trong thời gian thực, nó có thể gây ra nhiều vấn đề hơn giải quyết, nhưng ít nhất nó sẽ cho phép bạn tiếp tục phiên của mình như thể bạn không bao giờ rời khỏi nó.
Cách sử dụng:
screen
cho lần bắt đầu đầu tiên, cuộn qua các tin nhắn giới thiệu, bạn sẽ được trao một thiết bị đầu cuối.screen -r
để tiếp tục phiên đó. Bạn có thể có một số phiên màn hình tách rời cùng một lúc, trong trường hợp này bạn sẽ được hiển thị một danh sách các phiên có sẵn.Có nhiều tùy chọn khác, ví dụ như màn hình chia nhỏ, và tất cả các phím tắt đều có thể tùy chỉnh hoàn toàn.
Câu trả lời đơn giản nhất ...
ctrl + z sẽ tạm dừng chương trình đang chạy
"bg" sẽ chạy nó trong nền
disown
hoặc nohup
), điều này thường sẽ không giữ cho quá trình chạy sau khi kết thúc phiên SSH.
Mặc dù mọi người đều nói sử dụng disown
(tùy chọn duy nhất bạn có sau khi bạn đã bắt đầu quá trình), nohup
hoặc thậm chí chạy lệnh trong screen
, rất hữu ích nếu bạn muốn xem tất cả đầu ra từ lệnh ... Tôi là một fan hâm mộ của screen
.. Tôi vẫn đã thử hầu hết các bản phân phối chính thống gần đây của Linux và chỉ đơn giản là đặt công việc ở chế độ nền và bỏ việc không khiến tất cả các quy trình đang chạy bị chết. Phải có một thiết lập toàn cầu hoặc một cái gì đó. Tôi đang thử điều này trên một số hệ thống khá cũ (slackware 12) và tập lệnh thử nghiệm của tôi tiếp tục chạy cho đến khi tôi tự hủy nó:
shell$ cat > test.pl
#!/usr/bin/perl
while(1){
sleep(1);
}
shell$ perl ./test.pl &
shell$ exit
logout
shell$ ps aux test.pl
mymom 31337 1 0 13:25 ? 00:00:00 perl ./test.pl
shell$
Mặc dù tôi đồng ý rằng đó screen
sẽ là cách tốt nhất để chạy nó, ngay cả khi tập lệnh của tôi được ghi vào tệp nhật ký hoặc bất cứ điều gì .. Tôi không bao giờ cần phải sử dụng disown -a
hoặc nohup
trừ khi nó hoàn toàn bị hoang tưởng. Có lẽ ai đó có thể làm sáng tỏ về cách bash cư xử theo mặc định? Có thể một số quản trị viên hệ thống thay đổi mặc định trên các vỏ lớn để giữ cho các quy trình của người dùng của họ không làm quá tải hệ thống?
Thật không may, một phiên SSH bị chấm dứt có thể dẫn đến tmux hoặc màn hình bị tắt. Điều này là do systemd
sẽ chấm dứt bất kỳ tiến trình con nào khi đăng xuất khỏi phiên.
Bạn có thể thay đổi cài đặt này trong logind.conf
( /etc/systemd/logind.conf
):
KillUserProcesses=no
Cảm ơn câu trả lời trong https://unix.stackexchange.com/questions/490267 .
Thay vì :
cmd options;
Thêm trước nohup
:
nohup cmd options &
Sau đó, bạn sẽ có thể thấy thiết bị xuất chuẩn của giao diện điều khiển bằng cách:
tail -f nohup.out