Linux Can';使用ssh、nohup&;网猫
试图解决一个恼人的问题,如果我能找到正确的序列正确地逃逸,这个问题肯定是可以解决的 场景:我有一个与zfs send/recv一起使用的脚本,为了在本地网络中获得最佳性能,我希望该脚本连接到接收机器,生成一个netcat侦听器管道到zfs recv,然后我将从源脚本发送到它 我构造的命令类似于:Linux Can';使用ssh、nohup&;网猫,linux,bash,ssh,netcat,nohup,Linux,Bash,Ssh,Netcat,Nohup,试图解决一个恼人的问题,如果我能找到正确的序列正确地逃逸,这个问题肯定是可以解决的 场景:我有一个与zfs send/recv一起使用的脚本,为了在本地网络中获得最佳性能,我希望该脚本连接到接收机器,生成一个netcat侦听器管道到zfs recv,然后我将从源脚本发送到它 我构造的命令类似于: rcmd="nohup nc -l -p $NCPORT|zfs recv $destfs > /dev/null 2>&1" 并通过以下方式启动: ssh -f $RHOST "
rcmd="nohup nc -l -p $NCPORT|zfs recv $destfs > /dev/null 2>&1"
并通过以下方式启动:
ssh -f $RHOST "${rcmd}"
然后使用以下命令启动发送流:
zfs send $locallastsnap | nc $RHOST $NCPORT
在接收端,我看到它产生了两个进程
bash -c nohup nc -l -p 12739|zfs recv backup/data
nc -l -p 12739
因此,在线路的某个地方,globbing正在丢失与recv命令和nohup stdout/err重定向的管道连接 我想您的管道可能有问题。您可以在远程计算机上看到此命令:
bash -c nohup nc -l -p 12739|zfs recv backup/data
但你想让它说:
bash -c "nohup nc -l -p 12739|zfs recv backup/data"
否则,我认为您的管道将等待bash退出并将输出管道化到zfs
所以,你可以自己尝试添加这些引语:
rcmd="\"nohup nc -l -p $NCPORT|zfs recv $destfs > /dev/null 2>&1\""
我认为您不应该在
ps
/等输出中看到重定向。它们不是正在运行的命令的一部分,它们是它的shell调用的一部分。好吧,这就解释了缺少2>&1的原因,但我仍然停留在其余部分。我尝试了无数种不同的转义机制,但都没有成功。我看不出发布的代码有任何明显的错误。重定向应该出现在bash的ps
行中,因为它们是作为参数传递给bash的带引号字符串的一部分。ps可能正在截断其输出中的命令行。考虑对BASH进程的PID检查“代码> /PRO//CMDLIN < /代码>,查看实际传递给BASH的内容。关于缺少<代码> ZFS 命令,尝试在不重定向的情况下运行SSH命令,这样您就可以从命令中看到任何错误。Bash可能无法启动zfs,或者zfs可能正在打印错误消息并提前退出。我让脚本打印所有命令,这样我就可以继续执行,如果我手动启动它们,一切都会正常工作。唉。由于没有ZFS recv进程监听,我在发送端得到了一个断开的管道,然后清理代码终止了nc进程,但在接收端没有早期错误,重定向被关闭。我不这么认为。如果-c
没有看到整个字符串,您就不会在流程列表中看到所有字符串(您只会看到管道前面的部分)。不幸的是,它看起来令人困惑,但这是删除引用位置的副作用。