/ proc / meminfo не обновляется при чтении из ssh-скрипта - PullRequest
0 голосов
/ 27 июня 2019

У меня есть следующий скрипт в 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'"

У меня есть хост-компьютер и целевой компьютер, на который я копирую. Перед тем, как запустить этот скрипт, я уже скопировал большой файл в / tmp в целевой папке.

Когда я запускаю этот скрипт, он копирует файл / tmp / big ok, но когда он входит в цикл для синхронизации флэш-памяти, и я жду, пока meminfo Dirty достигнет нуля, то, что я вижу, всегда повторяется Dirty: 74224 kB в петля.

Однако в другом сеансе ssh, вошедшем в систему к цели, она у меня работает:

watch -n1 "cat /proc/meminfo | grep Drity"

И я вижу, что этот счетчик уменьшился с ~ 74000 КБ до 0 КБ.

Разница в том, что сессия ssh, выполняющая watch, вошла в систему как root, а ssh вошла в user.

Итак, я выполнил тот же тест с оболочкой ssh, вошедшей в систему как user, и всегда видел 0kb в Drity ...

Означает ли это, что user не может прочитать памятку, относящуюся ко всей системе? - как я могу узнать, когда флэш-память синхронизировалась как пользователь без полномочий root?

1 Ответ

4 голосов
/ 27 июня 2019

Поскольку аргумент 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 может выполнять сопоставление с образцом и принимать аргумент имени файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...