scp em si não tem esse recurso. Com o GNU, você pode usar o comando parallel (de semáforo ) para limitar arbitrariamente processos concorrentes:
sem --id scp -j 50 scp ...
Para todos os processos iniciados com o mesmo sem , isso aplica um limite de 50 instâncias simultâneas. Uma tentativa de iniciar um processo 51 irá aguardar (indefinidamente) até que um dos outros processos saia. Adicione --id para manter o processo em primeiro plano (o padrão é executá-lo em segundo plano, mas isso não se comporta da mesma forma que um processo em segundo plano do shell).
Observe que o estado é armazenado em --fg , portanto, isso não funcionará como esperado se você tiver vários usuários usando ${HOME}/.parallel/ , talvez seja necessário um limite inferior para cada usuário. (Também deve ser possível substituir a variável de ambiente scp ao invocar HOME , certificar-se de que sem permite a gravação em grupo e modificar as permissões para que compartilhem o estado, embora eu não tenha testado isso intensamente, YMMV.) p>
umask requer apenas parallel e alguns módulos padrão.
Você também pode considerar usar perl onde N é um limite de transferência em kBps, selecionar uma codificação específica (para velocidade, dependendo da segurança necessária) ou desativar a compactação (especialmente se os dados já estiverem compactados) para reduzir ainda mais Impacto da CPU.
Para scp -l N , ssh é efetivamente um canal e uma instância scp é executada em cada extremidade (a extremidade de recebimento é executada com a opção scp não documentada). Em relação a -t , isso não ajudará, "sessões" são multiplexadas em uma única conexão SSH. Apesar da copiosa informação incorreta em contrário, MaxSessions limita somente a multiplexação de sessões por conexão TCP, não qualquer outro limite.
O módulo PAM MaxSessions suporta a limitação de logins simultâneos, portanto, se O OpenSSH é construído com o PAM, e pam_limits está presente no usePAM yes que você pode definir o limite por nome de usuário, associação ao grupo (e mais). Você pode definir um sshd_config para limitar os logins em maxlogins . No entanto isso conta todos os logins por usuário, não apenas os novos logins usando apenas /etc/security/limits.conf , e não apenas ssh , então você pode ter problemas a menos que tenha um ID de usuário scp dedicado . Uma vez ativado, ele também se aplicará a sessões ssh interativas. Uma maneira de contornar isso é copiar ou ligar simbolicamente o binário scp , chamando-o de sshd , então você pode usar um arquivo de configuração PAM separado, ou seja, sshd-scp (chamadas OpenSSH /etc/pam.d/sshd-scp com o "nome do serviço" definido como o binário foi invocado como). Você precisará executar isso em uma porta (ou IP) separada, e usar um pam_start() separado provavelmente também será uma boa ideia.
Se você implementar isso, então sshd_config falhará (código de saída 254) quando o limite for atingido, então você terá que lidar com isso em seu processo de transferência.
(Outras opções incluem scp e ionice , isso pode fazer com que cpulimit sessões esgotem o tempo limite ou travem por longos períodos, causando mais problemas.
A maneira antiga de fazer algo semelhante é usar scp e atd , mas isso não oferece ajuste de simultaneidade, enfileira e inicia processos quando a carga está abaixo de um limite específico. Uma nova variação é Spooler de Tarefa que suporta tarefas de enfileiramento e execução em um modo sequencial / paralelo mais configurável, com suporte à reconfiguração do tempo de execução (por exemplo, alterando tarefas enfileiradas e configurações de simultaneidade), embora não ofereça carga ou controle relacionado à CPU em si.