从ssh脚本读取时/ proc / meminfo不更新

时间:2019-06-27 10:26:12

标签: linux bash ssh

我在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。在运行此脚本之前,我已经将一个大文件scp到目标的/ tmp中。

当我运行此脚本时,它会复制文件/ tmp / big ok,但是当它进入循环以同步闪存时,我等待meminfo Dirty归零,我看到的总是{{1 }}在循环中重复。

但是在另一个登录到目标的ssh会话中,我正在运行它:

Dirty: 74224 kB

我看到这个计数从〜74000kb减少到0kB。

区别在于,执行watch -n1 "cat /proc/meminfo | grep Drity"的ssh会话以root用户身份登录,而ssh则登录到watch中。

因此,我以user登录的ssh shell进行了相同的测试,并且在Drity中始终看到0kb ...

这是否意味着user无法读取与整个系统有关的meminfo? -如何知道何时以非root用户身份同步了闪存?

1 个答案:

答案 0 :(得分:4)

由于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/meminfogrep Dirtyawk可以进行模式匹配并接受文件名参数。