Сообщение появляется в случае, если определенный процесс (в данном случае sftp-server
) не получает ЦП в течение 120 секунд (ограничение по умолчанию). Это могло быть вызвано высокой нагрузкой на систему. Обычно это может быть вызвано ожиданием любого ресурса, наиболее вероятными кандидатами являются ЦП, диск и сеть.
При отладке таких проблем вы можете проверить скорость записи на диск:
$ dd if=/dev/zero of=/tmp/output conv=fdatasync bs=384k count=1k; rm -f /tmp/output
1024+0 records in
1024+0 records out
402653184 bytes (403 MB) copied, 2753.13 s, 146 kB/s
Вы должны ожидать значения в МБ / с, например 50–230 МБ / с
в зависимости от жесткого диска. В этом случае пропускная способность 146 кБ / с
чрезвычайно мала и может вызывать такие сообщения ядра.
Вы также можете использовать iostat -x 5
для отслеживания использования диска.
Вам не нужно этого делать как документ ЗДЕСЬ (что и делает материал <<
).
Вы можете просто выполнить ssh remotehost "command1; command2; command3"
например.
% ssh localhost "date ; uptime ; echo hello"
sweh@localhost's password:
Tue Jul 19 08:07:48 EDT 2016
08:07:48 up 15 days, 31 min, 3 users, load average: 0.33, 0.33, 0.40
hello
Однако scp
не так легко объединить таким образом.
Таким образом, вы можете захотеть изучить использование аутентификации с открытым ключом вместо аутентификации по паролю (также известной как «ключи ssh»). Обычно такие вещи автоматизируются.
Открыть SSH-соединение один раз, а затем использовать его в обратном порядке. Эта возможность OpenSSH называется мастер-соединениями. См. Использование уже установленного канала SSH
ssh_control_socket="$(mktemp)"
ssh -o ControlPath="$(ssh_control_socket)" -o ControlMaster=yes -o ControlPersist=yes administrator@host "mkdir ${DIR}"
# other commands using ssh (ssh, scp, rsync, …): pass the same ControlPath option
ssh -o ControlPath="$(ssh_control_socket)" -t administrator@host "…"
rsync -e "ssh -o 'ControlPath=$(ssh_control_socket)'" …
ssh -o ControlPath="$(ssh_control_socket)" administrator@host -O exit
rm -f "$(ssh_control_socket)"
Раздражает то, что вам нужно явно передавать параметр ControlPath
при каждом вызове SSH (это имя файла, который используется для связи между каждым вызовом ssh
и оригинальным клиентом SSH, который установил фактическое соединение). Здесь я передаю явное имя сокета, чтобы сценарий был самодостаточным. Если полагаться на ~/.ssh/config
приемлемо, то добавьте эту строку в ~/.ssh/config
:
ControlPath ~/.ssh/%l_%h_%p_%r.multiplex
Это позволит каждому SSH-клиенту проверить, есть ли существующее соединение, чтобы использовать его. Функция не будет использоваться до тех пор, пока не будет прослушиваемого главного соединения, вам все еще нужно передать -o ControlMaster=yes
(или -M
для краткости) при первом соединении, т.е. ваш сценарий может быть
# Open the shared connection
ssh -M -o ControlPersist=yes administrator@host :
# … all SSH-relying commands in their basic form, they will go via the shared connection …
# Close the shared connection
ssh -O exit administrator@host