bash – nohup在使用双&符号(\u0026\u0026)而不是
我有一个脚本,它使用ssh登录到远程计算机,cd到特定目录,然后启动守护程序.原始脚本如下所示:
ssh server "cd /tmp/path ; nohup java server 0</dev/null 1>server_stdout 2>server_stderr &" 此脚本似乎工作正常.但是,当用户输入错误的路径以使cd失败时,它不健壮.由于;,即使cd失败,此命令也会尝试运行nohup命令. 明显的修复不起作用: 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服务器cd / failed / path然后我得到一个真正的退出代码.建议? 解决方法
见
Bash’s Operator Precedence.
&因为它的优先级高于&&和整个声明.您不需要ssh来验证这一点.只需在shell中运行: $sleep 100 && echo yay & [1] 19934 如果&只是连接到echo yay,然后你的shell会睡100秒,然后报告后台工作.然而,整个睡眠100&& echo yay是背景,你会立即得到工作通知.正在运行的工作将显示它挂出: $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 &'" 另外,关于你对帖子的评论,
这是不正确的.直接来自联机帮助页:
确实: $bash -c "true ; exit 1" $echo $? 1 $bash -c "false ; exit 22" $echo $? 22 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |