如何将nohup输出重定向到指定文件?

11

我尝试了一些在SO上找到的例子,但它们似乎都不起作用。我正试图使用nohup运行我的应用程序,并将应用程序的输出追加到一个文件中。

我尝试了以下几种方法,但似乎都行不通。

nohup dotnet application.dll &> out.log &
nohup dotnet application.dll > out.log 2>&1 &
nohup dotnet application.dll > /opt/out.log &

我总是收到类似于

-bash: out.log: Permission denied

我尝试使用sudo运行应用程序,但似乎仍然无法正常工作。




nohup dotnet application.dll &

程序运行良好,但是输出被导向到了其他目录,例如/home/ubuntu/nohup.out

我做错了什么?


1
nohup dotnet application.dll > out.log 2>&1 & 应该可以工作。 - haccks
1
显然,您没有该文件的写权限。先解决这个问题,然后再考虑 nohup& - melpomene
@haccks 这相当于 OP 的前两次尝试。 - melpomene
@melpomene;就是这样。应该可以工作。 - haccks
所有的例子都应该能够正常工作,尽管最后一个会省略 stderr... - Morten
1个回答

21

nohup dotnet application.dll > out.log 2>&1 & 是正确的写法。

> out.log 将 STDOUT 重定向到文件 out.log

2>&1 将 fd2 (STDERR) 重定向到 fd1 (STDOUT),而后者已经被重定向到文件 out.log

你的问题在于文件权限(或只读文件系统)。在你的命令前加上 sudo 无法解决这个问题,因为只有 sudo 执行的 nohup dotnet application.dll 是以 root 权限执行的,输出重定向是由 bash 使用普通用户权限执行的。你可以通过调用一个带有 root 权限的单独 shell 来解决这个问题:

sudo sh -c 'nohup dotnet application.dll > out.log 2>&1 &'

重定向标准输出和标准错误有两种格式:&>word>&word。在这两种形式中,第一种是首选的。这在语义上等同于 >word 2>&1 - Morten
谢谢,原来是我的文件权限问题。我以为所有的东西都会以sudo身份运行,而不仅仅是其中的一部分。 - jjmcc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接