TL; DR:使用sudo -b
や、より良いです、。openvpn [...] --daemon
実行しているのでopenvpn
(より具体的には、プログラムをバックグラウンドでrootとして実行したいので)、バックグラウンドでコマンドを実行する方法に関する最も一般的な情報は、状況に対処しません。あなたが言った:
cpenvpnコマンドに&を追加し、その前にnohopを配置しようとしました。両方とも機能しません。
あなたのコマンドは:
sudo openvpn ~/my_connection.ovpn
下にsudo
あなたが最近のためのパスワードを入力していない場合のデフォルトの設定、sudo
(対話的に使用、一般的にこの手段同じ端末用)と同じ文脈で、それはあなたのパスワードを要求します。ただし、バックグラウンドでコマンドを追加して&
実行すると、行は表示されず、入力する機会も与えられません。[sudo] password for user:
したがって、この状況では、コマンドを実行し、パスワードを入力し、後でバックグラウンドに送信するのが、インタラクティブな使用のための合理的な方法です。
しかし、それが唯一の方法ではなく、あなたが言うように、あなたはスクリプトでそれをしたくないでしょう。
方法1:必ずsudo
新しいタイムスタンプを使用してください。
sudo
最初に実行することにより、コマンドを実行するために使用されるときに、現在のタイムスタンプがあることを確認できます。
sudo -v
その後、その後、次を実行できます。
sudo openvpn ~/my_connection.ovpn &
ただし、通常、バックグラウンドでを使用してコマンドを実行する場合は、完全に避ける&
(およびnohup
)ことをお勧めしますsudo
。これは、特にスクリプトの場合です。
方法2:を使用しsudo -b
ます。一般的に、これは通常あなたが望むものです。
代わりsudo
に、フォアグラウンドで自分自身を実行できますが、-b
フラグを渡すsudo
と、コマンドがバックグラウンドで実行されます。
sudo -b openvpn ~/my_connection.ovpn
これは通常、コマンドをスクリプトに挿入する場合に特に優れた方法です。ではsudo -b
、あなたが取得しないジョブ制御を、しかし、シェルスクリプトのジョブ制御ではデフォルトで無効になっていると、あなたは、通常はそれを使用するべきではありません。
以下のようにman sudo
説明しています。
-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.
これは、 sudoがパスワードを受信し(必要な場合)、コマンドの実行が許可されていると判断されるまで、バックグラウンドで何も実行されないため機能します。
方法3:しかし、のためにopenvpn
、おそらくあなただけでそれを実行する必要があり--daemon
ます。
openvpn
--daemon
オプションを指定して実行すると、バックグラウンドで自動的に実行されます。
sudo openvpn ~/my_connection.ovpn --daemon
前ではなくファイル名の--daemon
後に渡します.opvn
。後続の引数--daemon
(ある場合)は、デーモン化されたopenvpn
プロセスが使用する名前として解釈されます。(また、追加しないでください&
。)
これが適切かどうかは、openvpn
実行後、デーモン化する前に相互作用が発生する必要があるかどうかによって異なります。そして、それは、部分的に、で設定されているものに依存し~/my_connection.ovpn
ます。ただし、openvpn
すぐにデーモン化できなかった場合、バックグラウンドですぐに実行する他のすべての方法も壊れます。
そのため、バックグラウンドで実行openvpn
を開始したいことがわかっていて、フォアグラウンドに戻したくないことがわかっている場合は、--daemon
オプションで呼び出す方法を強く検討する必要があります。これは、多くのサーバープログラムにそのようなオプションがありますが、openvpn
ほとんどのプログラムは--daemon
オプションをサポートしていません。(ただし、名前と構文は異なります。)
このオプション(とどのようにあなたがそれを使用する)を使用するかどうかを決定するために、私はあなたが読んでお勧めのマニュアルページを、特に上のセクションでは、。これには多くの有用な情報があり、ここでは最初の段落のみを引用しています。openvpn
--daemon
--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 [...]
方法4:スクリプト全体をルートとして実行するのが妥当な場合があります。
rootとして複数のアクションを実行するスクリプトがある場合、rootとしてではなく合理的に実行される重要なアクティビティはありません。また、非rootユーザーとしてスクリプトを実行することから得られるものはありません。スクリプトのユーザーは、おそらくルートとして実行する必要があります。
この場合、sudo
スクリプトのコマンドから削除する必要があります。スクリプトがルートとして実行される場合、の必要はありませんsudo
。(rootユーザーは、デフォルトでは、と自分自身を含む任意のユーザーとして任意のコマンドを実行することができますがsudo
及びそうするためのパスワードを必要としません。あなたがもしそうならやるの休暇インスタンスsudo
スクリプトでは、それは意志おそらくまだ仕事。)
sudo
スクリプトにのインスタンスがあり、実際にroot以外のユーザーとしてコマンドを実行するために使用されている場合は、それらのインスタンスを保持する必要があります。-u user
スクリプト全体をルートとして実行している場合、コマンドのバックグラウンドでの典型的な実行方法のほとんどが適用されます。これには、追加&
や、必要に応じてnohup
(既に知っている)の使用が含まれます。ただし、このためには、このオプションを使用openvpn
することを強く検討する必要があり--daemon
ます。