我知道如何更改目录:
cd path
我知道如何分离一个进程:
command &
,,,,
nohup command > /tmp/test_output.txt 2>&1 &
nohup command > /dev/null 2>&1 &
disown command &
这是一个很好的参考: 如何将一个进程从终端完全分离?
但我不知道如何同时做这两件事,这似乎是不可能的。有人能帮我吗?以下是我尝试过的一些方法:
path/command
nohup cd path && command > /tmp/test_output.txt 2>&1 &
cd path && nohup command > /tmp/test_output.txt 2>&1 &
cd path && disown command &
(cd path && disown command &)
(cd path && command) &
cd path ; command &
我可以让它出错,我可以让它转到该路径并运行(但不脱离我的终端)或者我可以让它运行脱离我的终端但在我当前工作目录中的命令,而不是 cd 路径。
我无法让它从我的终端分离进程并同时从不同于我自己的目录运行命令。
你能帮我吗?有可能吗?
答案1
有和nohup
之间的差异disown
&
(您可能还会发现这个答案有趣的)。
您使用的语法disown command
无效,至少在 Bash 中无效;请参阅help disown
。在某些情况下command & disown
就足够了,但是
[
command
] 仍然连接到终端,因此如果终端被破坏[...],程序在尝试从标准输入读取或写入标准输出时就会失败。
不过nohup command &
看起来更好
nohup
不会从 shell 的作业控制中移除该进程
这看起来似乎无害,但是如果它困扰你,那么就disown
这样做:
nohup command &
disown
但如果工作在disown
行动之前终止,那么你将放弃其他作业(如果有的话)。在 Bash 中执行此操作的正确方法是使用$!
:
$!
扩展为最近放入后台的作业的进程 ID
因此这样更好:
nohup command &
disown $!
(由于disown
之后nohup
主要是装饰性的,从现在开始我将省略它。如果需要的话就使用它)。
若要cd
在command
不影响当前 shell 的情况下执行此操作,最好的方法是在子 shell 中执行此操作(您尝试过,但不是用nohup
):
(cd path && nohup command) &
甚至
(cd path && exec nohup command) &
其中exec
,makenohup
替换不再需要的子 shell 进程;nohup
然后将被替换为,command
因为这是该工具的工作方式。这样,您最终会得到一个进程,而不是多个进程。
或者,您可以使用nohup
整个 shell。这样您就可以执行多个命令:
nohup sh -c 'cd path || exit; command1; command2' &
(在这种情况下exec
仅在 之前才有意义command2
)。
注意:除非您重定向其输出(请参阅),否则nohup
将创建一个文件。文件的创建位置取决于进程的当前工作目录,因此一般来说,您在( )之前创建文件还是在 ( ) 之前创建文件会有所不同。nohup.out
man 1 nohup
nohup
cd
nohup
cd path && nohup ...
nohup sh -c 'cd path ... '