Как добавить запись cronjob динамически через код моего приложения (например, NodeJS) в контейнер на основе Ubuntu? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть приложение nodejs, основанное на микросервисной архитектуре, которое я планирую запустить на кластере kubernetes путем его контейнера. Мне нужно это приложение, чтобы запросить из базы данных всех записей cron и добавить эти записи cron в crontab на том же сервере, где находится мое приложение.

Когда я запрашиваю все свои записи cron и получаю список заданий cron, как показано ниже:

1 * * * * root node /home/project/app.js 103
1 * * * * root node /home/project/app.js 104
1 * * * * root node /home/project/app.js 105

Мне нужно динамически добавлять эти задания cron на сервер (здесь сервер - это мой контейнер приложений, основанный на образе ubuntu), когда я делаю запрос к базе данных, чтобы вывести список заданий. Как мне добавить эти задания cron из моего приложения на мой сервер? Есть ли прямое решение этого или это можно сделать с помощью любой библиотеки в NodeJS?

Я просмотрел библиотеку shelljs для NodeJS, мне она показалась немного сложной, поэтому я не смог попробовать. любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Я бы не рекомендовал просматривать несколько записей cron для одного приложения - потому что если у вас есть несколько записей для нескольких приложений, оно станет очень большим, и добавление некоторых самостоятельно станет очень трудным.

Когда требуемое время выполнения никогда не меняется, просто создайте файл "cron.sh" в корневом каталоге файлов js вашего узла и запишите в него все команды.

crontab -e: 1 * * * * root /home/project/cron.sh > /home/project/cron.log

Содержимое /home/project/cron.sh:

#!/bin/bash
# Change directory:
cd /home/project/
# Run the script with all parameters
node ./app.js 103
node ./app.js 104
node ./app.js 105

Не забудьте chmod 0770 cron.sh, чтобы иметь возможность писать в него и, поскольку вы, кажется, запускаете этот cron как root, не позволяйте другим пользователям выполнять команды как root.

/ e: для непосредственного изменения файла crontab вы можете использовать следующий код оболочки для первого экспорта, изменения и импорта заданий:

const exec = require('child_process').exec;
const fs  = require('fs');
// Read content of file
function ReadCronFile(cb) {
    exec("crontab -l", function(err, stdout, stderr) {
        cb(stdout);
    });
}
// Write a crontab file
function WriteCronFile(data, cb) {
    fs.writeFile("tmp.txt", data, function(err) {
        exec("crontab tmp.txt", function(err, stdout, stderr) {
            fs.unlink("tmp.txt", function(err) {
                cb();
            });
        });
    });
}
// Example usage
ReadCronFile(function(data) { console.log(data); });
WriteCronFile("...", function() { console.log("Done!"); });

Примечание: код не проверен Или с Promise (протестировано OP)

const exec = require('child_process').exec;
const fs  = require('fs');
// Read content of file
function ReadCronFile() {
    return new Promise(function(resolve, reject) {
        exec("crontab -l", function(err, stdout, stderr) {
            if(err) return reject(err);
            else return resolve(stdout);
        });
    });
}
// Write a crontab file
function WriteCronFile(data) {
    fs.writeFile("tmp.txt", data, function(err) {
        if(err) return reject(err);
        exec("crontab tmp.txt", function(err, stdout, stderr) {
            fs.unlink("tmp.txt", function(err) {
                if(err) return reject(err);
                else return resolve();
            });
        });
    });
}
// Example usage
ReadCronFile().then(function(data) {
    console.log(data);
}).catch(function(err) {
    console.log(err);
});
WriteCronFile("...").then(function() {
    console.log("Done!");
}).catch(function(err) {
    console.log(err);
});

Для разбора файла crontab вы можете использовать https://github.com/harrisiirak/cron-parser

0 голосов
/ 02 мая 2018

Попробуйте Модуль Cron NPM

С него очень легко начать, и у него много возможностей для реализации сложных заданий.

...