Polyconseil/grocker

Killing cron

Closed this issue · 4 comments

Lors des mises à jour, il serait préférable d’arrêter le conteneur cron sans tuer tous les jobs qui sont en cours. En gros, il faudrait :

  1. Ne plus lancer de nouveaux jobs (crontab -r)
  2. Demander à cron de s'arrêter
  3. Attendre la fin des jobs en cours

Les point 2. et 3. peuvent être inversés si nécessaire, le 1. et 2. peuvent se faire en même temps (en arrêtant cron sans supprimer la crontab).

PoC utilisant prctl(PR_SET_CHILD_SUBREAPER)

#!/usr/bin/python
from __future__ import print_function
import ctypes
import os

libc = ctypes.CDLL('libc.so.6')
PR_SET_CHILD_SUBREAPER = 36
libc.prctl(PR_SET_CHILD_SUBREAPER)

print('Running script.sh...')
os.system('bash script.sh')
print('Waiting for grandchildren...')
while True:
    try:
        r = os.wait()
        print('Grandchild:', r)
    except OSError as e:
       print(e)
       break

script.sh :

#!/bin/bash
yes > /dev/null &
sleep 10 &

Backported in V1 with 302245f