Last active
May 26, 2020 08:10
-
-
Save luqmaan/596702955f44692f28f8476e45066ac7 to your computer and use it in GitHub Desktop.
Script from my blog post "Using systemd as a better cron." https://medium.com/horrible-hacks/using-systemd-as-a-better-cron-a4023eea996d. β οΈ It may not actually work. π€·ββοΈ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const fs = require("fs"); | |
const getTimerTemplate = (platform, importType, interval) => ` | |
[Unit] | |
Description=Run ${platform}-${importType} every 15 minutes | |
Requires=${platform}-${importType}.service | |
[Timer] | |
Unit=${platform}-${importType}.service | |
OnUnitInactiveSec=${interval} | |
RandomizedDelaySec=${interval} | |
AccuracySec=1s | |
[Install] | |
WantedBy=timers.target | |
`; | |
const getServiceTemplate = (platform, importType, cmd) => ` | |
[Unit] | |
Description=Runs ${platform} ${importType} | |
# This will auto-start the cron timer | |
Wants=${platform}-${importType}.timer | |
[Service] | |
ExecStart=${cmd} | |
WorkingDirectory=/app/shoes-scraper | |
Slice=shoes-scraper.slice | |
[Install] | |
WantedBy=multi-user.target | |
`; | |
const getSliceTemplate = () => ` | |
[Unit] | |
Description=Limited resources Slice | |
DefaultDependencies=no | |
Before=slices.target | |
[Slice] | |
CPUQuota=80% | |
MemoryLimit=2.7G | |
`; | |
const getInstallTemplate = services => ` | |
#!/usr/bin/env bash | |
set -e | |
set -x | |
systemctl daemon-reload && systemctl stop ${services | |
.map(service => `${service}`) | |
.join(" ")} | |
systemctl daemon-reload && systemctl enable ${services | |
.map(service => `${service}.timer`) | |
.join(" ")} | |
systemctl daemon-reload && systemctl start ${services | |
.map(service => `${service}.timer`) | |
.join(" ")} | |
sudo /etc/init.d/datadog-agent start | |
`; | |
const InstallPath = "/etc/systemd/system"; | |
const services = []; | |
[ | |
{ | |
importType: "recent", | |
interval: "15m", | |
platform: "shopify", | |
cmd: | |
"/usr/local/bin/node /app/shoes-scraper/src/scraper --recent --platform shopify" | |
}, | |
{ | |
importType: "full", | |
interval: "12h", | |
platform: "shopify", | |
cmd: | |
"/usr/local/bin/node /app/shoes-scraper/src/scraper --full --platform shopify" | |
}, | |
{ | |
importType: "recent", | |
interval: "30m", | |
platform: "nike", | |
cmd: | |
"/usr/local/bin/node /app/shoes-scraper/src/scraper --recent --platform nike" | |
}, | |
{ | |
importType: "full", | |
interval: "18h", | |
platform: "nike", | |
cmd: | |
"/usr/local/bin/node /app/shoes-scraper/src/scraper --full --platform nike" | |
}, | |
{ | |
importType: "recent", | |
interval: "1h", | |
platform: "adc", | |
cmd: | |
"/usr/local/bin/node /app/shoes-scraper/src/scraper --recent --platform adc" | |
}, | |
{ | |
importType: "full", | |
interval: "18h", | |
platform: "adc", | |
cmd: | |
"/usr/local/bin/node /app/shoes-scraper/src/scraper --full --platform adc" | |
}, | |
{ | |
importType: "recent", | |
interval: "1h", | |
platform: "sns", | |
cmd: | |
"/usr/local/bin/node /app/shoes-scraper/src/scraper --recent --platform sns" | |
}, | |
{ | |
importType: "full", | |
interval: "24h", | |
platform: "sns", | |
cmd: | |
"/usr/local/bin/node /app/shoes-scraper/src/scraper --full --platform sns" | |
}, | |
].forEach(({ importType, interval, platform, cmd }) => { | |
const serviceName = `${platform}-${importType}`; | |
fs.writeFileSync( | |
`${InstallPath}/${platform}-${importType}.timer`, | |
getTimerTemplate(platform, importType, interval) | |
); | |
fs.writeFileSync( | |
`${InstallPath}/${platform}-${importType}.service`, | |
getServiceTemplate(platform, importType, cmd) | |
); | |
fs.writeFileSync( | |
`${InstallPath}/shoes-scraper.slice`, | |
getSliceTemplate(platform, importType) | |
); | |
services.push(serviceName); | |
}); | |
fs.writeFileSync(`/tmp/install-timers.sh`, getInstallTemplate(services)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment