Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

246
Visualizações
¿Qué está deteniendo el temporizador de usuario de mi systemd?

Uso los temporizadores de usuario de systemd como reemplazo de cron. Tengo un programa particular configurado para ejecutarse cada 20 minutos. El programa no es un demonio, depende de la red y lanza una serie de procesos secundarios. Sin embargo, he notado que el temporizador se detiene con frecuencia después de unas pocas horas (o días). El temporizador sigue activo, pero el programa ya no se ejecuta cada 20 minutos. pgrep muestra una serie de procesos aún activos. Después de observar esto, agregué JobTimeoutSec=3m al archivo .service con la expectativa de que los procesos se eliminarían si caducaban.

systemctl status --user PROGRAM.service ahora genera lo siguiente; sin embargo, los procesos secundarios aún se están ejecutando y el temporizador ya no ejecuta el programa cada 20 minutos:

13 de febrero 15:03:45 HOSTNAME systemd[1878]: Job PROGRAM.service/start timed out.

13 de febrero 15:03:45 HOSTNAME systemd[1878]: se agotó el tiempo de inicio de la DESCRIPCIÓN.

13 de febrero 15:03:45 HOSTNAME systemd[1878]: Job PROGRAM.service/start falló con el resultado 'tiempo de espera'.

Supongo que los procesos secundarios del programa se están estancando debido a dificultades de la red y systemd no los elimina cuando se agota el tiempo de espera.

¿Alguna sugerencia para resolver esto de modo que el temporizador continúe como se esperaba?

Reemplazar ExecStart=/path/to/program con ExecStart=/usr/bin/timeout 20m /path/to/program parece resolver esto, pero me gustaría saber por qué systemd solo no lo hace.


Información de depuración

PROGRAMA.servicio

 [Unit] Description=DESCRIPTION After=network.target PartOf=network-online.target JobTimeoutSec=3m [Service] Type=oneshot ExecStart=/path/to/program [Install] WantedBy=network-online.target

PROGRAMA.temporizador

 [Unit] Description=Run PROGRAM.service every 20 minutes [Timer] OnCalendar=*:0/20 [Install] WantedBy=timers.target

systemd --version genera lo siguiente:

sistemad 219

+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Proceso activo

Hay dos cosas importantes en systemd que creo que estás golpeando en este caso:

  1. Cuando inicia un proceso con systemd , todos los procesos secundarios (al menos de forma predeterminada) forman parte del mismo grupo.

  2. Si alguno de esos niños no muere, se considera que el proceso todavía está (al menos un poco) en marcha.

¿Qué significa eso?

La descripción del temporizador dice:

Tenga en cuenta que en caso de que la unidad a activar ya esté activa en el momento en que transcurre el tiempo, no se reinicia, sino que simplemente se deja funcionando.

En otras palabras, si alguno de sus procesos sigue ejecutándose 20 minutos después, el sistema del temporizador no reiniciará nada.

¡¿Por qué esto tiene sentido?!

CRON estaba haciendo exactamente lo mismo. Si su proceso todavía se estaba ejecutando, no lo reiniciaría una y otra vez (porque eso solo llenaría la memoria y posiblemente rompería muchas otras cosas). Sin embargo, CRON no tenía concepto de grupo de procesos. Entonces, si su proceso principal murió, asumió que podría reiniciarlo.

¿Cuál es la solución systemd?

Suponiendo que no puede simplemente detener los procesos secundarios (aunque dado que usó /usr/bin/timedout , probablemente pueda hacerlo), una forma es usar la opción KillMode , aunque no lo recomiendo:

 KillMode=process

Esto significa que una vez que el proceso principal murió, se considera que el servicio se detuvo.

Si se establece en proceso, solo se elimina el proceso principal.

Es posible que desee probar si eso realmente funciona, ya que según la documentación no dice que considerará a todo el grupo como muerto... Pero según mi experiencia, eso funciona.

¿Cuál es una mejor solución entonces?

Como no recomiendo KillMode , debería haber otra solución. El hecho es que todos sus procesos tienen 20 minutos para ejecutarse (o la cantidad de tiempo restante en el momento en que se generan) o evitarán que suceda la siguiente ejecución, lo que puede estar bien de vez en cuando, pero ciertamente no si se quedan para siempre. Entonces sería editar esos procesos y asegurarse de que se cierren después de un tiempo.

Sin embargo, después de un tiempo , puede ser necesario eliminar esos procesos y usar la herramienta de tiempo de espera como lo ha hecho podría ser la mejor solución si los procesos en sí mismos no pueden cerrarse a tiempo . Aunque sugeriría una pequeña modificación, que es usar 19 min. para el tiempo de espera, porque de lo contrario puede perder la siguiente ventana de inicio.

 ExecStart=/usr/bin/timeout 19m /path/to/program
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda