TL; DR: Gunakan sudo -b
atau, lebih baik ,.openvpn [...] --daemon
Karena Anda menjalankan openvpn
(dan, kurang spesifik, karena Anda ingin menjalankan program sebagai root di latar belakang), informasi yang paling umum dikeluarkan tentang cara menjalankan perintah di latar belakang tidak mengatasi situasi Anda. Kamu berkata:
Saya sudah mencoba menambahkan a & ke perintah cpenvpn dan menempatkan nohop di depannya. Keduanya tidak berfungsi.
Perintah Anda adalah:
sudo openvpn ~/my_connection.ovpn
Di bawah sudo
konfigurasi default, jika Anda belum memasukkan kata sandi Anda sudo
dalam konteks yang sama (untuk penggunaan interaktif, biasanya ini berarti terminal yang sama) maka ia akan meminta kata sandi Anda. Tetapi jika Anda menjalankan perintah di latar belakang dengan menambahkan &
maka Anda tidak akan ditampilkan baris atau diberi kesempatan untuk mengetiknya.[sudo] password for user:
Jadi dalam situasi ini, menjalankan perintah, memasukkan kata sandi, dan mengirimnya ke latar belakang setelahnya adalah cara yang masuk akal untuk melakukannya, untuk penggunaan interaktif .
Tapi itu bukan satu-satunya cara dan, seperti yang Anda katakan, Anda tidak akan mau melakukan itu dalam naskah .
Cara 1: Pastikan Anda sudo
memiliki cap waktu yang baru.
Anda dapat memastikan bahwa sudo
memiliki cap waktu saat ini ketika digunakan untuk menjalankan perintah Anda, dengan terlebih dahulu menjalankan:
sudo -v
Kemudian, setelah itu, Anda dapat menjalankan:
sudo openvpn ~/my_connection.ovpn &
Namun, biasanya lebih baik untuk menghindari &
(dan nohup
) sama sekali ketika Anda ingin menjalankan perintah di latar belakang sudo
. Ini khususnya kasus untuk scripting.
Cara 2: Gunakan sudo -b
. Secara umum, ini biasanya yang Anda inginkan.
Sebagai gantinya, Anda dapat menjalankan sudo
dirinya sendiri di latar depan, tetapi melewati -b
bendera sehingga sudo
menyebabkan perintah untuk dijalankan di latar belakang.
sudo -b openvpn ~/my_connection.ovpn
Ini biasanya merupakan cara yang lebih baik, terutama jika Anda meletakkan perintah dalam skrip. Dengan sudo -b
Anda tidak mendapatkan kontrol pekerjaan , tetapi dalam shell script kontrol pekerjaan dinonaktifkan secara default dan Anda biasanya tidak menggunakannya .
Seperti yang man sudo
dijelaskan:
-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.
Ini berfungsi karena tidak ada yang berjalan di latar belakang sampai setelah sudo menerima kata sandi Anda (jika perlu) dan memutuskan bahwa Anda diizinkan untuk menjalankan perintah.
Cara 3: Tapi untuk openvpn
, Anda mungkin harus menjalankannya --daemon
.
openvpn
akan berjalan di latar belakang secara otomatis jika Anda menjalankannya dengan --daemon
opsi:
sudo openvpn ~/my_connection.ovpn --daemon
Lulus --daemon
setelah .opvn
nama file Anda daripada sebelumnya; argumen berikut --daemon
, jika ada, ditafsirkan sebagai nama yang openvpn
harus digunakan oleh proses daemonized . (Apakah tidak juga append &
.)
Apakah ini sesuai atau tidak tergantung pada apakah atau tidak ada interaksi harus terjadi setelah openvpn
telah dijalankan tetapi sebelum terwujud. Dan itu tergantung, sebagian, pada apa yang diatur ~/my_connection.ovpn
. Tetapi jika openvpn
tidak bisa segera daemonize, maka semua cara lain untuk segera menjalankannya di latar belakang juga akan rusak .
Oleh karena itu, dalam situasi di mana Anda tahu bahwa Anda ingin openvpn
untuk mulai berjalan di latar belakang, dan Anda tahu Anda tidak akan ingin membawa kembali ke latar depan, Anda harus sangat mempertimbangkan metode memohon itu dengan --daemon
pilihan. Ini khusus untuk - openvpn
sebagian besar program tidak mendukung --daemon
opsi, meskipun banyak program server memiliki beberapa opsi seperti itu. (Namun nama dan sintaks bervariasi.)
Untuk memutuskan apakah atau tidak untuk menggunakan opsi ini (dan bagaimana Anda ingin menggunakannya), saya sarankan Anda membaca dengan openvpn
halaman buku panduan , terutama pada bagian --daemon
. Ini memiliki banyak informasi yang berguna, dan saya hanya mengutip paragraf pertama di sini:
--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 [...]
Cara 4 : Kadang-kadang masuk akal untuk menjalankan seluruh skrip sebagai root.
Jika Anda memiliki skrip yang melakukan beberapa tindakan sebagai root, skrip tidak memiliki aktivitas signifikan yang secara wajar dijalankan bukan sebagai root, dan tidak pernah ada yang berguna untuk menjalankan skrip sebagai pengguna non-root, maka pengguna skrip sebaiknya menjalankannya sebagai root.
Jika ini masalahnya, maka Anda harus menghapus sudo
dari perintah dalam skrip. Ketika skrip dijalankan sebagai root, tidak perlu sudo
. (Meskipun root kaleng, secara default, jalankan perintah apapun sebagai pengguna termasuk dirinya dengan sudo
dan tidak perlu password untuk melakukannya. Jadi, jika Anda melakukan hal cuti dari sudo
dalam script maka akan mungkin masih bekerja.)
Jika Anda memiliki contoh sudo
dalam naskah yang benar-benar digunakan untuk menjalankan perintah karena beberapa user selain root (dengan ), maka Anda harus tetap menjaga mereka contoh.-u user
Jika seluruh skrip dijalankan sebagai root, maka sebagian besar cara khas membuat perintah dijalankan di latar belakang berlaku, termasuk menambahkan &
dan, jika perlu, penggunaan nohup
(yang sudah Anda ketahui). Untuk ini, meskipun, Anda masih harus sangat mempertimbangkan menggunakan openvpn
dengan --daemon
pilihan.