Comment exécuter un script à intervalle régulier sur un CoreOS ?

Pour exécuter un script bash à intervalle régulié sur un CoreOS, on peut utiliser les systemd timers.

L’exemple ci-dessous copie un fichier vers un répertoire toutes les 2 minutes. Mais vous pouvez exécuter le script que vous voulez.


Créer le fichier service. Il doit être créé dans ce répertoire, et son nom doit se terminer par « .service »

sudo vi /etc/systemd/system/copy.service

Contenu du fichier de service

[Unit]
Description=Copy files from a folder to another

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c '/home/core/script/copy'

Le script appelé copy qui s’exécute dans le service

#!/bin/bash
# Copy the hello.png file to home folder
cp /tmp/hello.png /home/core/

Créez le timer. Il faut le mettre dans le même répertoire, et son nom doit se terminer par « .timer »

sudo vi /etc/systemd/system/copy.timer

Contenu du fichier

[Unit]
Description=Run service every 2 minutes

[Timer]
OnCalendar=*:0/2

Quelques commandes utiles

# Pour lister tous les timers
sudo systemctl list-timers --all

Cela permet de savoir quand le timer va s’exécuter à nouveau, et quand il s’est exécuté la dernière fois.

# Pour démarrer le timer
sudo systemctl start copy.timer
# Pour l'arrêter
sudo systemctl stop copy.timer

Voir la documentation :
https://coreos.com/os/docs/latest/scheduling-tasks-with-systemd-timers.html

Comment faire un heap dump de la JVM d’un container Docker ?


Si vous n’avez pas de jdk dans vos containers Docker, vous ne pourrez pas directement faire de heap dump de la JVM. Par exemple, si vos containers sont basés sur Alpine, avec un jre OpenJdk. Il n’y a pas les outils nécessaires.

Exemple pour faire un heap dump.  Les commandes sont à effectuer depuis la machine hôte.

# Installer un OpenJdk pour pouvoir lancer le dump
docker exec -ti container-name apk add \ 
--no-cache openjdk8

# Lister les process java du container, 
# et mémoriser celui de l'application, ici c'est le 22
docker exec -ti container-name jps

# Créer un heap dump
# à la fin de la commande, remplacer 22 par le bon pid
# le dump se fait ici à la racine /
docker exec -ti container-name jmap \
-dump:live,format=b,file=/heapDump.hprof 22


# Copier le dump, 
# du container vers la machine hôte
docker cp container-name:/heapDump.hprof ./