TL; DR: Sử dụng sudo -bhoặ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 sudocấu hình mặc định, nếu gần đây bạn chưa nhập mật khẩu cho sudocù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 sudocó dấu thời gian mới.
Bạn có thể đảm bảo rằng sudocó 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ể sudotự chạy ở nền trước, nhưng truyền -bcờ để sudokhiế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 -bbạ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 sudogiả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.
openvpnsẽ tự động chạy trong nền nếu bạn chạy nó với --daemontùy chọn:
sudo openvpn ~/my_connection.ovpn --daemon
Vượt qua tên tệp --daemoncủa bạn .opvnchứ không phải trước đó; đối số sau đây --daemon, nếu có, được hiểu là tên mà openvpnquy 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 openvpnkhô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 --daemontù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ợ --daemontù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 openvpntrang 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ỏ sudokhỏ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ó sudovà không cần mật khẩu để làm như vậy. Vì vậy, nếu bạn để lại các sudophiê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 sudotrong 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 openvpnvới --daemontùy chọn.