加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – nohup在使用双&符号(\u0026\u0026)而不是

发布时间:2020-12-15 21:09:14 所属栏目:安全 来源:网络整理
导读:我有一个脚本,它使用ssh登录到远程计算机,cd到特定目录,然后启动守护程序.原始脚本如下所示: ssh server "cd /tmp/path ; nohup java server 0/dev/null 1server_stdout 2server_stderr " 此脚本似乎工作正常.但是,当用户输入错误的路径以使cd失败时,它不健
我有一个脚本,它使用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 &'"

另外,关于你对帖子的评论,

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读