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
你没有得到作业控制,但在shell脚本作业控制默认情况下禁用,你不应该经常使用它。
如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身份合理运行的重要活动,并且以非root用户身份运行该脚本也没有任何用处,那么脚本的用户可能应该仅以root用户身份运行它。
如果是这种情况,则应sudo
从脚本中的命令中删除。当脚本以root身份运行时,不需要sudo
。(尽管默认情况下,root用户可以使用任何用户身份(包括本身)以任何身份运行任何命令,sudo
并且不需要密码。因此,如果您确实sudo
在脚本中保留了实例,那么它可能仍然可以使用。)
如果sudo
脚本中有任何实例以root身份(带有)(而不是root )实际用于以其他用户身份运行命令,那么您仍应保留这些实例。-u user
如果整个脚本都以root用户身份运行,那么大多数使命令在后台运行的典型方法都适用,包括附加&
(必要时)以及使用nohup
(您已经知道)。但是,为此,您仍应强烈考虑openvpn
与--daemon
选项一起使用。