Làm cách nào để đặt tiến trình linux đang chạy hiện tại ở chế độ nền? [đóng cửa]


111

Tôi có một lệnh tải tệp lên bằng git lên máy chủ từ xa từ Linux shell và sẽ mất nhiều giờ để hoàn thành.

Làm cách nào để đặt chương trình đang chạy đó ở chế độ nền? Để tôi vẫn có thể làm việc trên shell và quá trình đó cũng được hoàn thành?


Chỉ là phỏng đoán nhưng bạn đã thử ctrl + z hoặc chạy lệnh của mình như thế này chưa; #command &
EralpB

Lệnh đã chạy nên tôi không có tùy chọn nào khác. Tôi không chắc nên thử lệnh nào. tôi không muốn phá vỡ quá trình hiện tại vì vậy tôi đã không thử nghiệm nó
Mirage

Sau đó chúng ta nên chờ một câu trả lời chuyên nghiệp hơn :) Ý tôi là nếu bạn có cơ hội bắt đầu lại từ đầu. (Lệnh & điều)
EralpB 3/12/12

Người trả lời được chấp nhận về vấn đề này giải thích ba bước mà cần phải được thực hiện: stackoverflow.com/questions/625409/...
Leonard Saers

Bạn cũng có thể chỉ cần mở phiên bản thứ hai của putty và kết nối lại với máy chủ để lấy một trình bao khác. Mặc dù giải pháp với ctrl+zlà tuyệt vời.
Ela782

Câu trả lời:


207

Tạm dừng quá trình bằng CTRL + Z, sau đó sử dụng lệnh bgđể tiếp tục quá trình trong nền. Ví dụ:

sleep 60
^Z  #Suspend character shown after hitting CTRL+Z
[1]+  Stopped  sleep 60  #Message showing stopped process info
bg  #Resume current job (last job stopped)

Tìm hiểu thêm về bgcách sử dụng và kiểm soát công việc trong bashtrang hướng dẫn sử dụng:

ĐIỀU KHIỂN CÔNG VIỆC
Nhập ký tự tạm ngừng (thường là ^ Z, Control-Z) trong khi một quy trình đang chạy khiến quy trình đó bị dừng và trả lại quyền điều khiển về bash. [...] Sau đó, người dùng có thể thao tác trạng thái của công việc này, sử dụng lệnh bg để tiếp tục công việc ở chế độ nền, [...]. A ^ Z có hiệu lực ngay lập tức và có thêm tác dụng phụ là khiến đầu ra đang chờ xử lý và lỗi chính tả bị loại bỏ.

bg [ jobspec ...]
Tiếp tục lại từng jobspec bị tạm dừng trong nền, như thể nó đã được bắt đầu bằng &. Nếu jobspec không xuất hiện, khái niệm của shell về công việc hiện tại sẽ được sử dụng.

BIÊN TẬP

Để bắt đầu một quá trình mà bạn thậm chí có thể giết thiết bị đầu cuối và nó vẫn tiếp tục chạy

nohup [command] [-args] > [filename] 2>&1 &

ví dụ

nohup /home/edheal/myprog -arg1 -arg2 > /home/edheal/output.txt 2>&1 &

Để chỉ bỏ qua đầu ra (không phải là rất khôn ngoan), hãy thay đổi tên tệp thành /dev/null

Để đặt thông báo lỗi thành một tệp khác, hãy thay đổi thành &1tên tệp.

Ngoài ra: Bạn có thể sử dụng jobslệnh để xem danh sách được lập chỉ mục của các quy trình nền đó. Và bạn có thể giết một quy trình nền bằng cách chạy kill %1hoặc kill %2với số là chỉ mục của quy trình.


tôi đã cố gắng nó nhưng như một cái gì đó outputing của nó, nó lại đến ở tiền cảnh với% hiển thị bao nhiêu dữ liệu được tải lên
Mirage

Quy trình sẽ ghi bất kỳ đầu ra nào vào thiết bị đầu cuối như bạn đã hướng dẫn quy trình thực hiện điều đó khi bắt đầu. Bạn sẽ phải khởi động lại nó để lấy đầu ra ghi vào tệp hoặc /dev/null. Xem chỉnh sửa ở trên.
Ed Heal

vì thế nó có nghĩa là, nếu quá trình này đã được bắt đầu sau đó không có cách nào chuyển hướng ouput
Mirage

Đúng vậy. Bạn không thể chỉ tạo hiệu ứng cho quá trình mà nó đang chạy. Bạn có thể thực hiện kill -9 <pid of your shellvà sau đó quá trình sẽ vẫn chạy và đầu ra sẽ bị loại bỏ - nhưng bạn sẽ phải đăng nhập lại để bắt đầu một trình bao mới.
Ed Heal

Bạn cũng có thể sử dụng disownlệnh nếu bạn cần đăng xuất khỏi phiên đầu cuối của mình và bạn muốn nó tiếp tục chạy.
kirk roerig
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.