TL; DR: Sử dụng sudo -b
hoặc, tốt hơn , .openvpn [...] --daemon
Vì bạn đang chạy openvpn
(và, ít cụ thể hơn, vì bạn muốn chạy một chương trình với quyền root trong nền), thông tin phổ biến nhất về cách chạy các lệnh trong nền không giải quyết được tình huống của bạn. Bạn đã nói:
Tôi đã cố gắng thêm một & vào lệnh cpenvpn và đặt nohop trước nó. Cả hai đều không hoạt động.
Lệnh của bạn là:
sudo openvpn ~/my_connection.ovpn
Trong sudo
cấu hình mặc định, nếu gần đây bạn chưa nhập mật khẩu cho sudo
cùng một ngữ cảnh (để sử dụng tương tác, thông thường, điều này có nghĩa là cùng một thiết bị đầu cuối) thì nó sẽ hỏi mật khẩu của bạn. Nhưng nếu bạn chạy lệnh trong nền bằng cách nối thêm &
thì bạn sẽ không được hiển thị dòng hoặc có cơ hội nhập lệnh.[sudo] password for user:
Vì vậy, trong tình huống này, chạy lệnh, nhập mật khẩu của bạn và gửi nó đến nền sau đó là một cách hợp lý để làm điều đó, để sử dụng tương tác .
Nhưng đó không phải là cách duy nhất và, như bạn nói, bạn sẽ không muốn làm điều đó trong một kịch bản .
Cách 1: Đảm bảo sudo
có dấu thời gian mới.
Bạn có thể đảm bảo rằng sudo
có dấu thời gian hiện tại khi nó được sử dụng để chạy lệnh của bạn, bằng cách chạy đầu tiên:
sudo -v
Sau đó, sau đó, bạn có thể chạy:
sudo openvpn ~/my_connection.ovpn &
Tuy nhiên, tốt hơn hết là tránh &
(và nohup
) hoàn toàn khi bạn muốn chạy một lệnh trong nền với sudo
. Điều này đặc biệt là trường hợp cho kịch bản.
Cách 2: Sử dụng sudo -b
. Nói chung, đây thường là những gì bạn muốn.
Thay vào đó, bạn có thể sudo
tự chạy ở nền trước, nhưng truyền -b
cờ để sudo
khiến lệnh được chạy trong nền.
sudo -b openvpn ~/my_connection.ovpn
Đây thường là một cách tốt hơn, đặc biệt nếu bạn đang đặt lệnh trong một tập lệnh. Với sudo -b
bạn không có quyền kiểm soát công việc , nhưng trong kịch bản shell, điều khiển công việc bị tắt theo mặc định và bạn thường không nên sử dụng nó .
Như man sudo
giải thích:
-b, --background
Run the given command in the background. Note that it is not
possible to use shell job control to manipulate background
processes started by sudo. Most interactive commands will
fail to work properly in background mode.
Điều này hoạt động vì không có gì đang chạy trong nền cho đến khi sudo nhận được mật khẩu của bạn (nếu cần) và xác định rằng bạn được phép chạy lệnh.
Cách 3: Nhưng đối với openvpn
, có lẽ bạn chỉ nên chạy nó với --daemon
.
openvpn
sẽ tự động chạy trong nền nếu bạn chạy nó với --daemon
tùy chọn:
sudo openvpn ~/my_connection.ovpn --daemon
Vượt qua tên tệp --daemon
của bạn .opvn
chứ không phải trước đó; đối số sau đây --daemon
, nếu có, được hiểu là tên mà openvpn
quy trình trình bày nên sử dụng. (Do không còn append &
).
Điều này có phù hợp hay không phụ thuộc vào việc có hay không bất kỳ tương tác nào phải xảy ra sau khi openvpn
được chạy nhưng trước khi nó khởi động. Và điều đó phụ thuộc, một phần, vào những gì được thiết lập ~/my_connection.ovpn
. Nhưng nếu openvpn
không thể ngay lập tức tạo ra, thì tất cả các cách khác để chạy ngay lập tức trong nền cũng sẽ bị hỏng .
Vì vậy, trong bất kỳ tình huống mà bạn biết bạn muốn openvpn
để bắt đầu chạy ở chế độ nền, và bạn biết bạn sẽ không muốn mang nó trở lại vào tiền cảnh, bạn nên xem xét mạnh mẽ phương pháp gọi nó với các --daemon
tùy chọn. Điều này đặc trưng cho openvpn
- các chương trình tối đa không hỗ trợ --daemon
tùy chọn, mặc dù nhiều chương trình máy chủ có một số tùy chọn như vậy. (Tuy nhiên, tên và cú pháp khác nhau.)
Để quyết định có hay không sử dụng tùy chọn này (và cách bạn muốn sử dụng nó), tôi khuyên bạn nên đọc các openvpn
trang hướng dẫn , đặc biệt là ở phần trên --daemon
. Nó có rất nhiều thông tin hữu ích, và tôi chỉ trích dẫn đoạn đầu tiên ở đây:
--daemon [progname]
Become a daemon after all initialization functions are
completed. This option will cause all message and error output
to be sent to the syslog file (such as /var/log/messages),
except for the output of scripts and ifconfig commands, which
will go to /dev/null unless otherwise redirected. The syslog
redirection occurs immediately at the point that --daemon is
parsed on the command line even though the daemonization point
occurs later. If one of the --log options is present, it will
supercede syslog redirection.
The optional progname parameter [...]
Cách 4 : Đôi khi việc chạy toàn bộ tập lệnh là root.
Nếu bạn có một tập lệnh thực hiện nhiều hành động với tư cách là root, thì nó không có hoạt động quan trọng nào có thể được chạy một cách hợp lý không phải là root và không bao giờ có gì hữu ích khi chạy tập lệnh với tư cách là người dùng không phải root, sau đó người dùng của tập lệnh có lẽ chỉ nên chạy nó dưới quyền root.
Nếu đây là trường hợp, thì bạn nên loại bỏ sudo
khỏi các lệnh trong kịch bản. Khi tập lệnh chạy bằng root, không cần sudo
. (Mặc dù người dùng root có thể, theo mặc định, chạy bất kỳ lệnh nào vì bất kỳ người dùng nào cũng bao gồm chính nó sudo
và không cần mật khẩu để làm như vậy. Vì vậy, nếu bạn để lại các sudo
phiên bản trong tập lệnh thì có thể nó vẫn hoạt động.)
Nếu bạn có bất kỳ phiên bản nào sudo
trong tập lệnh thực sự được sử dụng để chạy các lệnh như một số người dùng khác ngoài root (với ), thì bạn vẫn nên giữ các phiên bản đó.-u user
Nếu toàn bộ tập lệnh đang được chạy dưới quyền root, thì hầu hết các cách tạo lệnh chạy trong nền đều được áp dụng, bao gồm nối thêm &
và, khi cần, sử dụng nohup
(mà bạn đã biết). Đối với điều này, mặc dù, bạn vẫn nên cân nhắc mạnh mẽ sử dụng openvpn
với --daemon
tùy chọn.