gpt4 book ai didi

bash - nohup 在与双符号 (&&) 而不是分号 (;) 一起使用时不起作用

转载 作者:行者123 更新时间:2023-11-29 09:12:12 28 4
gpt4 key购买 nike

我有一个脚本,它使用 ssh 登录到远程机器,cd 到特定目录,然后启动守护进程。原始脚本如下所示:

ssh server "cd /tmp/path ; nohup java server 0</dev/null 1>server_stdout 2>server_stderr &"

此脚本似乎工作正常。但是,当用户输入错误的路径导致 cd 失败时,它并不稳健。由于 ;,此命令将尝试运行 nohup 命令,即使 cd 失败也是如此。

明显的修复不起作用:

ssh server "cd /tmp/path && nohup java server 0</dev/null 1>server_stdout 2>server_stderr &"

也就是说,直到服务器停止,SSH 命令才会返回。将 nohup 放在 cd 前面而不是放在 java 前面是行不通的。

谁能帮我解决这个问题?你能解释一下为什么这个解决方案不起作用吗?谢谢!

编辑:cbuckley 建议使用 sh -c,我从中得出:

ssh server "nohup sh -c 'cd /tmp/path && java server 0</dev/null 1>master_stdout 2>master_stderr' 2>/dev/null 1>/dev/null &"

但是,现在当 cd 失败时,退出代码总是 0;而如果我执行 ssh server cd/failed/path 然后我得到一个真正的退出代码。有什么建议吗?

最佳答案

参见 Bash's Operator Precedence .

& 被附加到整个语句,因为它比 && 具有更高的优先级。您不需要 ssh 来验证这一点。只需在您的 shell 中运行:

$ sleep 100 && echo yay &
[1] 19934

如果 & 仅附加到 echo yay,那么您的 shell 将休眠 100 秒,然后然后报告后台作业。但是,整个 sleep 100 && echo yay 是后台运行的,您会立即收到作业通知。运行 jobs 会显示挂起:

$ sleep 100 && echo yay &
[1] 20124
$ jobs
[1]+ Running sleep 100 && echo yay &

您可以使用括号在 echo yay & 周围创建一个子 shell,为您提供您所期望的:

sleep 100 && ( echo yay & )

这类似于使用 bash -c 运行 echo yay &:

sleep 100 && bash -c "echo yay &"

将这些放入 ssh,我们得到:

# using parenthesis...
$ ssh localhost "cd / && (nohup sleep 100 >/dev/null </dev/null &)"
$ ps -ef | grep sleep
me 20136 1 0 16:48 ? 00:00:00 sleep 100

# and using `bash -c`
$ ssh localhost "cd / && bash -c 'nohup sleep 100 >/dev/null </dev/null &'"
$ ps -ef | grep sleep
me 20145 1 0 16:48 ? 00:00:00 sleep 100

将此应用于您的命令,我们得到

ssh server "cd /tmp/path && (nohup java server 0</dev/null 1>server_stdout 2>server_stderr &)"

或:

ssh server "cd /tmp/path && bash -c 'nohup java server 0</dev/null 1>server_stdout 2>server_stderr &'"

此外,关于您对帖子的评论,

Right, sh -c always returns 0. E.g., sh -c exit 1 has error code 0"

这是不正确的。直接来自联机帮助页:

Bash's exit status is the exit status of the last command executed in the script. If no commands are executed, the exit status is 0.

确实:

$ bash -c "true ; exit 1"
$ echo $?
1
$ bash -c "false ; exit 22"
$ echo $?
22

关于bash - nohup 在与双符号 (&&) 而不是分号 (;) 一起使用时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15934751/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com