Skip to content

Instantly share code, notes, and snippets.

@luqmaan
Last active May 26, 2020 08:10
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save luqmaan/596702955f44692f28f8476e45066ac7 to your computer and use it in GitHub Desktop.
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. 🤷‍♂️
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