Câu trả lời:
Bạn có hai lựa chọn chính:
Chạy lệnh với nohup
. Điều này sẽ tách nó khỏi phiên của bạn và để nó tiếp tục chạy sau khi bạn ngắt kết nối:
nohup pythonScript.py
Lưu ý rằng thiết bị xuất chuẩn của lệnh sẽ được thêm vào một tệp được gọi nohup.out
trừ khi bạn chuyển hướng nó ( nohup pythonScript.py > outfile
).
Sử dụng một bộ ghép kênh màn hình như thế nào tmux
. Điều này sẽ cho phép bạn ngắt kết nối với máy từ xa nhưng sau đó, khi bạn kết nối lần sau, nếu bạn chạy tmux attach
lại, bạn sẽ thấy chính mình trong cùng một phiên. Lệnh vẫn sẽ chạy (nó sẽ tiếp tục chạy khi bạn đăng xuất) và bạn sẽ có thể thấy thiết bị xuất chuẩn và thiết bị xuất chuẩn của nó giống như bạn chưa bao giờ đăng xuất:
tmux
pythonScript.py
Khi bạn đã khởi chạy nó, chỉ cần đóng cửa sổ PuTTY. Sau đó, kết nối lại vào ngày hôm sau, chạy tmux attach
lại và bạn quay lại nơi bạn đã bắt đầu.
disown
2.screen
byobu
, một trình bao bọc xung quanh tmux hoặc màn hình.
Công screen
cụ, có sẵn cho tất cả các bản phân phối Linux, hỗ trợ điều này.
Để cài đặt nó, hãy chạy apt-get install screen
các bản phân phối Linux dựa trên gỡ lỗi hoặc
dnf install -y screen
hoặc yum install -y screen
cho các bản phát hành dựa trên RPM.
Để sử dụng:
$ screen
Một vỏ mới được bắt đầu. Trong shell này, bạn có thể bắt đầu tập lệnh Python của mình. Sau đó, bạn có thể nhấn Ctrl+ Shift+ Asau đó D. Nó sẽ tách thiết bị đầu cuối của bạn khỏi shell đang chạy tập lệnh của bạn. Hơn nữa, kịch bản vẫn đang chạy trong đó.
Để xem kịch bản của bạn đang chạy như thế nào, bạn có thể gọi screen -r
. Điều này sẽ gắn lại thiết bị đầu cuối của bạn vào trình bao với tập lệnh Python mà bạn còn chạy trong nền.
CẬP NHẬT: như Fox đã đề cập, màn hình hoạt động kém với systemd, nhưng chúng ta có thể sử dụng systemd để bắt đầu tập lệnh, như họ nói trong ví dụ chính thức .
Ví dụ: nếu tập lệnh của bạn được bắt đầu bởi /usr/bin/myPythonScript
, bạn có thể tạo tệp đơn vị Systemd, như thế này.
$ cat /etc/systemd/system/myPythonScript.service
[Unit]
Description=MyPythonScript
[Service]
ExecStart=/usr/bin/myPythonScript
[Install]
WantedBy=multi-user.target
Hơn, bạn có thể bắt đầu kịch bản này
# systemctl daemon-reload
# systemctl start myPythonScript
Nếu bạn muốn làm cho tập lệnh này tự động bắt đầu khi khởi động hệ thống -
# systemctl enable myPythonScript
Bất cứ lúc nào bạn có thể xem kịch bản của bạn đang chạy như thế nào
# systemctl status myPythonScript
Quảng cáo bạn có thể xem lại nhật ký của tập lệnh của mình
# journalctl -u myPythonScript -e
screen
không chính xác chơi độc đáo với systemd
cấu hình mặc định của nó. Tôi không biết nếu Ubuntu sử dụng systemd
, nhưng hành vi và cách giải quyết có thể đáng được đề cập trong câu trả lời của bạn
Hầu hết các quy trình có thể bị đánh lừa bằng cách chuyển hướng stdout, stderr, stdin của nó (không phải tất cả các mô tả luôn luôn cần thiết để chuyển hướng) và sử dụng &
toán tử điều khiển.
Xem đó ping example.com 1>/dev/null &
là công việc.
Tất nhiên, một số chương trình phức tạp hơn và yêu cầu các giải pháp như @terdon đã đề cập, nhưng thật tốt khi biết và sử dụng những gì phù hợp nhất.
EDIT: như được viết trong câu trả lời này sẽ giết chết systemd
các quá trình khi đăng xuất. Một số phiên bản của systemd
quy trình tiêu diệt khi đăng xuất theo mặc định, một số phiên bản khác thì không. Hành vi này có thể được thay đổi bằng cách sửa đổi /etc/systemd/logind.conf bằng cách đặt tùy chọn sau. Như đã viết, nó cũng có thể giải quyết một số vấn đề bạn có thể gặp phải với các giải pháp của @ terdon.
từ man logind.conf
:
KillUserProcesses=
Đưa ra một lập luận boolean. Định cấu hình xem các quy trình của người dùng có nên bị giết khi người dùng đăng xuất không. Nếu đúng, đơn vị phạm vi tương ứng với phiên và tất cả các quy trình bên trong phạm vi đó sẽ bị chấm dứt. Nếu sai, phạm vi bị "bỏ rơi", xem systemd.scope (5) và các quy trình không bị hủy. Mặc định là "có", nhưng xem các tùy chọn
KillOnlyUsers=
vàKillExcludeUsers=
bên dưới.Ngoài các quy trình phiên, quy trình người dùng có thể chạy dưới đơn vị người dùng đơn vị quản lý người dùng @ .service. Tùy thuộc vào cài đặt kéo dài, điều này có thể cho phép người dùng chạy các quy trình độc lập với các phiên đăng nhập của họ. Xem mô tả
enable-linger
trongloginctl
(1).Lưu ý rằng cài đặt
KillUserProcesses=yes
sẽ phá vỡ các công cụ nhưscreen
(1) vàtmux
(1), trừ khi chúng được chuyển ra khỏi phạm vi phiên. Xem ví dụ trongsystemd-run
(1).
Đọc câu trả lời liên kết để tìm hiểu thêm.
isatty()
và thoát nếu không?"
nohup
.