我在bash中有以下脚本:
ssh user@1.1.1.1 "echo 'start'
mkdir -p /home/user/out
cp /tmp/big_file /home/user/out
echo 'syncing flash'
sync
while [[ $(cat /proc/meminfo | grep Dirty | awk '{print $2}') -ne 0 ]] ; do
echo \"$(cat /proc/meminfo)\"
sleep 1
sync
done
echo 'done'"我有我的主机PC和目标PC,我正在复制到。在运行这个脚本之前,我已经将一个大文件放到了目标上的/tmp中。
当我运行这个脚本时,它会复制文件/tmp/big,但是当它进入循环同步闪存,然后等待meminfo Dirty达到零时,我看到的总是循环中重复的Dirty: 74224 kB。
但是,在不同的ssh会话中,我让它运行:
watch -n1 "cat /proc/meminfo | grep Drity"
我看到这个数字从74000 0kB下降到0kb。
不同之处在于,执行watch的ssh会话以根用户身份登录,ssh登录在user中。
因此,我对登录的ssh shell进行了与user相同的测试,并且始终在Drity中看到了0kb .
这是否意味着user无法读取与整个系统相关的内存信息?-我如何知道闪存何时作为非根用户进行同步?
发布于 2019-06-27 10:44:58
由于ssh的参数在双引号中,在发送命令之前,变量和命令替换在客户端本地展开,所以它们不是在远程机器上完成的。由于它们在客户机上被替换,所以每次循环都会得到相同的结果(因为客户机没有循环)。
您应该转义$字符,以便将它们发送到服务器,或者将命令放入单引号中(但单引号使在命令中包含单引号变得困难)。
ssh user@1.1.1.1 "echo 'start'
mkdir -p /home/user/out
cp /tmp/big_file /home/user/out
echo 'syncing flash'
sync
while [[ \$(awk '/Dirty/ {print \$2}' /proc/meminfo) -ne 0 ]] ; do
cat /proc/meminfo
sleep 1
sync
done
echo 'done'"在命令替换中也不需要使用cat /proc/meminfo和grep Dirty。awk可以进行模式匹配并接受文件名参数。
https://stackoverflow.com/questions/56789004
复制相似问题