Eu tenho que copiar arquivos em uma máquina. E os dados são imensamente grandes. Agora os servidores precisam servir normalmente, e geralmente há um intervalo específico de horas ocupadas neles. Então, existe uma maneira de executar esses comandos de uma maneira que, se o servidor atingir o horário de pico, ele pausará o processo e, quando sair desse intervalo, o retomará?
Resultado pretendido
cp src dst
if time between 9:00-14:00 pause process
After 14:00 resume cp command.
Você pode pausar a execução de um processo enviando um
SIGSTOP
sinal e depois retomá-lo enviando um arquivoSIGCONT
.Supondo que sua carga de trabalho seja um único processo (não fork helpers em execução em segundo plano), você pode usar algo assim:
Então, quando o horário de pico começar, envie um
SIGSTOP
:Mais tarde, quando o servidor estiver ocioso novamente, retome-o.
Você precisará agendar isso para horários específicos em que deseja que seja executado, você pode usar ferramentas como cron ou systemd timers (ou uma variedade de outras ferramentas semelhantes) para agendar isso. Em vez de agendar com base em um intervalo de tempo, você pode optar por monitorar o servidor (talvez observando a média de carga, o uso da CPU ou a atividade dos logs do servidor) para decidir quando pausar/retomar a cópia.
Você também precisa gerenciar o arquivo PID (se você usar um), certifique-se de que sua cópia ainda esteja em execução antes de pausá-la, provavelmente você desejará limpar removendo o arquivo PID assim que a cópia estiver concluída, etc.
Em outras palavras, você precisa de mais em torno disso para tornar um processo confiável, mas a ideia básica de usar esses
SIGSTOP
eSIGCONT
sinais para pausar/retomar a execução de um processo parece ser o que você está procurando.Em vez de suspender o processo, você também pode dar prioridade mais baixa:
dará a ele a prioridade mais baixa (a mais alta gentileza), para que o processo ceda a CPU para outros processos que precisam dela na maior parte do tempo.
No Linux, o mesmo pode ser feito com E/S com
ionice
:Colocará o processo na classe "idle", de modo que ele só terá tempo de disco quando nenhum outro programa tiver solicitado E/S de disco por um período de carência definido .
Sim, você precisa adquirir o ID do processo para pausar (através do
ps
comando), então faça:O processo aparecerá com o Status "T" (em
ps
).Para continuar, faça um:
Use rsync, esqueça o cp, para este cenário. existem parâmetros para limitar a largura de banda, ou podem ser mortos/parados e iniciados mais tarde, de uma forma que continuará, de onde deixou o google rsync example/s
Se você vai fazer isso interrompendo o processo em execução, sugiro jogar com o programa Screen. Eu não uso o Linux há algum tempo, mas o IIRC apenas pausar o comando e retomá-lo mais tarde deixa você bastante vulnerável, se você for desconectado acidentalmente, não poderá retomar sua sessão.
Com a tela acredito que você possa interromper a sessão, desanexá-la e sair. Mais tarde, você pode voltar e reconectar a essa sessão. Você teria que brincar um pouco com isso, mas tornou as sessões muito mais robustas.
Você também pode sair e ir para casa, fazer login remotamente, reconectar-se ao sistema que você iniciou no escritório e retomá-lo à noite e, em seguida, recuperá-lo no dia seguinte no trabalho.
Se o seu shell suportar (quase todos o fazem), você pode pressionar ^Z (Ctrl+Z) para enviar facilmente um
SIGTSTP
sinal para a tarefa de primeiro plano e continuar comfg
(em primeiro plano) oubg
(em segundo plano).Se você fizer isso em várias tarefas e quiser retornar a elas mais tarde, poderá usar
jobs
o comando e retornar comfg/bg %#
, onde # é o número fornecido entre colchetes nas tarefas.Lembre-se de que
SIGTSTP
é um pouco diferente deSIGSTOP
(que é usado em todas as outras respostas), principalmente devido ao fato de que pode ser ignorado (mas não vi um programa ignorá-lo além desl
). Mais detalhes podem ser encontrados nesta resposta no StackOverflow .