- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个脚本,它使用 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/
我正在尝试在后台运行长时间运行的任务,而无需登录并让终端返回提示,但是当我这样做时,该任务似乎进入了后台,但是除非我输入提示,否则我的提示将不可用点击控制键+ c。我想运行任务,然后重新获得提示。 [
我做了以下事情: nohup find / & rm nohup.out 奇怪的是,nohup 命令继续运行。我等待创建新文件。令我惊讶的是没有这样的文件。命令的标准输出去了哪里? 最佳答案 在 UN
我不知道我是否可以用 nohup 做到这一点,但这是个问题....我有这个命令: nohup java -XX:MaxHeapFreeRatio=70 -Xmx2048M -XX:+HeapDumpO
我无法理解仅使用 nohup 运行脚本与使用 nohup 和“&”之间的区别。我理解,对于后者,如果我想杀死它,我可以杀死进程id。但是对于前者,我可以直接按“CTRL+C”来杀死脚本吗?所以如果我要
如何使用 nohup 运行命令,以便 stdout 和 stderr 都保存到 nohup.out?默认情况下只保存 stdout 而丢弃 stderr。 最佳答案 试试这个 nohup 2>&1 E
我的 nohup 命令有问题。 当我运行我的工作时,我有很多数据。输出 nohup.out 变得太大,我的进程变慢了。如何在不获取 nohup.out 的情况下运行此命令? 最佳答案 nohup命令仅
我的 FreeBSD 8.4 机器上运行着一个 nohup 进程。最初我正在查看通过 输出的 nohup 控制台消息 tail -f nohup.out 但是我不小心删除了 nohup.out 文件。
所以假设我有一个名为 script1 的脚本,它在代码中的某处调用 script2: ... ./script2 ... 假设我这样运行 script1: nohup ./script1 script
我在尝试编写一个相当简单的 Cap 脚本来停止和启动我在远程机器上运行的一些守护进程时感到非常沮丧。 本质上, run "for I in {1..40}; do nohup python ~/pyd
我正在尝试使用 nohup 运行 ruby 脚本: nohup ruby script.rb & 这需要几个小时才能运行,但会通过 puts 记录其进度。 通常,我可以查看 nohup.out 以
我想通过 nohup.php 启动我的服务器,但是命令没有运行并显示以下错误 nohup:ignoring input and appending output to 'nohup.out' 我正在通
我遇到无法运行 nohup -p 的情况在 Linux RHEL 6.6 框中,它表示不支持此选项。我阅读了联机帮助页,在 Linux 中它只有 --help和 --version作为 Linux
对于一个应用程序,我希望每秒钟访问一个 url。为了在我的 Google Cloud ubuntu 服务器上实现这一点,我运行了这个命令nohup watch -n 1 curl https://ww
我使用以下命令: nohup & 并记录到nohup.out文件中,但是此日志文件可能变得非常大,所以想知道是否存在一种方法,当nohup.out得到时,将输出自动保存到nohup1.out,noh
与使用 nohup 相比,将脚本作为守护进程运行有何影响? 我知道 fork 进程等方面有什么区别,但这对我的脚本有什么影响? 最佳答案 nohup 命令是穷人将进程作为守护进程运行的方式。正如 Br
我正在尝试让 OrientDB(一个数据库)在 Ubuntu 上运行的启动脚本。 目前这是导致问题的行: ORIENTDB_DIR="/usr/local/orientdb" ORIENTDB_USE
我正在使用 nohup 命令运行一个 java 应用程序。 nohup java -jar test.jar 我正在使用 log4j 从我的应用程序中写入输出。在 log4j.properties 文
我的 bashrc 中有一个小函数,因此我可以运行脚本并在完成后将输出发送到我的电子邮件。代码如下: run() { email=example@gmail.com last="${!
我正在尝试 nohup 一个命令并以不同的用户身份运行它,但每次我这样做都会产生两个进程。 例如: $ nohup su -s /bin/bash nobody -c "my_command" > o
我正在使用 nohup 将 java 输出和错误附加到同一个日志文件。问题是它写了一个输出,然后它覆盖错误日志文件,输出被删除。 nohup命令是 nohup java Daemon 1000 >lo
我是一名优秀的程序员,十分优秀!