EQVPS

በVPS ላይ ሥራዎችን በcron እና በsystemd ታይመሮች እንዴት መርሐግብር ማውጣት

ባክአፖችን፣ ጽዳትን እና ስክሪፕቶችን በመርሐግብር ያስኪዱ። cron በአምስት ደቂቃ እና ሥራዎችን በዝምታ የሚያበላሹ ሦስት ወጥመዶች፣ ከዚያ ለሎጎች፣ ከመቋረጥ በኋላ ለማካካስ እና ለትክክለኛ ሰዓት የsystemd ታይመሮች። ከዚህ በታች ያለው እያንዳንዱ ባህሪ በአዲስ Ubuntu 24.04 ሰርቨር ላይ ተሞክሯል።

ሰርቨር ዋጋውን የሚያወጣው እርስዎ ሲተኙ በመሥራት ነው፦ ባክአፖች፣ የሎግ ሽክርክሪት፣ የሰርተፊኬት እድሳት፣ በዘጠኝ ሰዓት ሪፖርት። Linux ለዚህ ሁለት መርሐግብር አውጪዎች አሉት። cron አርባ ዓመቱ ሲሆን አንድ መስመር ይበቃዋል። የsystemd ታይመሮች ሁለት ትናንሽ ፋይሎች ይፈልጋሉ፣ በምትኩ ሎጎችን፣ ከመቋረጥ በኋላ ማካካስን እና ትክክለኛ ሰዓትን ይሰጣሉ። ይህ መመሪያ ሁለቱንም በUbuntu 24.04 ላይ ይሸፍናል፤ እያንዳንዱ ባህሪ ከኢሜጃችን በተነሳ አዲስ ሰርቨር ላይ ተረጋግጧል፣ የcron ሥራ አንድ ቃል ሳይናገር እንዲወድቅ የሚያደርጉትን ሦስት ስህተቶች ጨምሮ።

sudo ያለው ተጠቃሚ ያስፈልግዎታል፤ የUbuntu ማዋቀሪያ መመሪያ አንዱን ይፈጥራል።

1. cron በአምስት ደቂቃ

cron በእኛ Ubuntu እና Debian ኢሜጆች ላይ ተጭኖ እየሠራ ነው። እያንዳንዱ ተጠቃሚ የሥራ ሰንጠረዥ አለው፤ የእርስዎን በዚህ ያርትዑ፦

crontab -e

እያንዳንዱ መስመር አምስት የሰዓት መስኮችና አንድ ትዕዛዝ ነው፦

# min hour day month weekday  command
  30  3    *   *     *        /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
  */5 *    *   *     *        /usr/local/bin/check.sh
  0   9    *   *     1-5      /usr/local/bin/report.sh
  @reboot                     /usr/local/bin/start-tunnel.sh

ማለትም፦ በየሌሊቱ 03:30 ላይ፣ በየ5 ደቂቃው፣ በሥራ ቀናት 09:00 ላይ እና ከእያንዳንዱ ማስነሳት በኋላ አንድ ጊዜ። */5 ማለት በየአምስተኛው እሴት፣ 1-5 ክልል፣ 1,15 ዝርዝር ነው። የሰርቨሩ የሰዓት ዞን ይሠራል፣ በኢሜጆቻችን ላይ UTC ነው፤ የእርስዎን በየሆስት ስምና የሰዓት ዞን መመሪያ አንድ ጊዜ ያዘጋጁ፣ cron ይከተለዋል።

የተሠራውን በjournalctl -u cron ይመልከቱ። እያንዳንዱ ሩጫ ተጠቃሚውንና ትዕዛዙን ይመዘግባል፣ ሦስቱ ወጥመዶች የሚታዩትም እዚያ ነው።

ወጥመድ 1፦ ውጤቱ ይጠፋል። cron የሥራን ውጤት ለተጠቃሚው በኢሜይል ይልካል። ኢሜጃችን የመልእክት ሰርቨር የለውም፣ ስለዚህ journal (CRON) info (No MTA installed, discarding output) አሳየ፣ ውጤቱም ጠፋ። እንደ መጀመሪያው ምሳሌ በ>> /var/log/backup.log 2>&1 ራስዎ ያዙሩት።

ወጥመድ 2፦ የመቶኛ ምልክት። በcrontab ውስጥ % ትዕዛዙን ይጨርሳል፣ ቀሪውንም ወደ መደበኛ ግብዓት ይቀይራል። date +%F > /tmp/today መርሐግብር አወጣን። journal cron በእርግጥ ያስኬደውን ያሳያል፦ CMD (date +)። ምንም ፋይል አልተጻፈም፣ ምንም ስህተትም አልደረሰን። \% ይጻፉ፣ ወይም ትዕዛዙን በስክሪፕት ውስጥ አድርገው ስክሪፕቱን መርሐግብር ያውጡለት።

ወጥመድ 3፦ የተለየ አካባቢ። cron ሥራዎችን በbash ሳይሆን በ/bin/sh፣ በhome ማውጫዎ እና በጠባብ አካባቢ ያስኪዳል። በUbuntu 24.04 ላይ PATH ከስሙ የተሻለ ሆኖ ተገኘ፦ /usr/local/bin እና /snap/binን ጨምሮ ሙሉ የስርዓት ዱካ፣ ለroot እና ለተራ ተጠቃሚ። አሁንም የሚጎድለው በhome ማውጫዎ ስር ያለው ሁሉ ነው፦ ~/.local/bin፣ የnvm node፣ pipx፣ cargo። በሥራው ውስጥ ሙሉ ዱካዎችን ይጠቀሙ ወይም መስመሩን በ. $HOME/.profile; ይጀምሩ።

የተጠቃሚ ሳይሆን የስርዓቱ የሆኑ ሥራዎች በ/etc/cron.d/ ውስጥ አንድ ተጨማሪ መስክ (ተጠቃሚው) ያለው ፋይል ሆነው ይቀመጣሉ፦

30 3 * * * root /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Ubuntu በ/etc/cron.hourly፣ cron.daily፣ cron.weekly እና cron.monthly ውስጥ ያለውን ሁሉ ያስኪዳል፤ በየሰዓቱ 17ኛ ደቂቃ፣ 06:25 ላይ፣ እሁድ 06:47 ላይ እና በወሩ 1ኛ ቀን 06:52 ላይ። ተፈጻሚ የሆነ ስክሪፕት እዚያ ያስቀምጡ፣ ከሌሎቹ ጋር ይሠራል።

2. የsystemd ታይመሮች

ታይመር ሁለት ዩኒቶች ነው፦ ሥራውን የሚሠራ አገልግሎት እና መቼ እንደሆነ የሚናገር ታይመር። መጀመሪያ ስክሪፕቱን፣ ከዚያ ዩኒቶቹን ይፍጠሩ።

sudo nano /usr/local/bin/backup.sh
sudo chmod +x /usr/local/bin/backup.sh
sudo nano /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
sudo nano /etc/systemd/system/backup.timer
[Unit]
Description=Run the backup every night at 03:30

[Timer]
OnCalendar=*-*-* 03:30
Persistent=true
AccuracySec=1m

[Install]
WantedBy=timers.target

አገልግሎቱን ሳይሆን ታይመሩን ያንቁ፦

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer

list-timers ቀጣዩን ሩጫ፣ እስከዚያ የቀረውን ጊዜ እና የመጨረሻውን ሩጫ ያሳያል። ሎጎች ማዋቀር አያስፈልጋቸውም፦ journalctl -u backup.service እያንዳንዱን መጀመር፣ መጨረስ እና እያንዳንዱን የውጤት መስመር ከሰዓት ማህተም ጋር ይዟል። ሥራውን አሁኑኑ ለማስኬድ sudo systemctl start backup.service፤ መርሐግብሩን ከማመንዎ በፊት ስክሪፕቱን የሚፈትኑትም በዚህ ነው።

የቀን መቁጠሪያ አገባብ። OnCalendar እንዲህ ይነበባል፦ የሳምንት-ቀን ዓመት-ወር-ቀን ሰዓት:ደቂቃ:ሰከንድ፣ * ማንኛውም እሴት ነው። ከመጠቀምዎ በፊት አገላለጹን ይፈትኑ፦

systemd-analyze calendar "Mon..Fri *-*-* 03:00" --iterations 2

መደበኛውን ቅጽ እና ቀጣዮቹን ቀኖች ያትማል። ያረጋገጥናቸው አንዳንድ አገላለጾች፦

OnCalendarትርጉም
*-*-* 03:30በየቀኑ 03:30 ላይ
Mon..Fri *-*-* 09:00በሥራ ቀናት 09:00 ላይ
*:0/15በየ15 ደቂቃው
weeklyሰኞ 00:00 ላይ
*-*-01 04:00በየወሩ 1ኛ ቀን 04:00 ላይ
*-*-* 03:00 Europe/Kyivበኪዬቭ ሰዓት 03:00፤ በሙከራችን 01:00 UTC ላይ ሠራ

ማወቅ የሚገባቸው ሦስት ቅንብሮች። Persistent=true የመጨረሻውን ሩጫ በዲስክ ላይ ያስቀምጣል እና ሰርቨሩ ጠፍቶ ወይም ታይመሩ ቆሞ ሳለ ያመለጠውን ሩጫ ያካክሳል። በየሁለት ደቂቃው የሚሠራውን ታይመራችንን አቁመን፣ የታቀደ ሩጫ እስኪያልፍ ጠብቀን እንደገና አስጀመርነው፦ ያመለጠው ሩጫ በዚያው ሰከንድ ውስጥ ጀመረ። Persistent ከሌለ በቀላሉ ቀጣዩን ጊዜ ይጠብቃል።

AccuracySec አስገራሚው ነገር ነው። በነባሪ systemd ታይመሮችን በአንድ ደቂቃ መስኮት ውስጥ ያሰባስባል፣ ስለዚህ የመጀመሪያ ሩጫችን በ07:42:00 ሳይሆን በ07:42:18 መጣ። በAccuracySec=1s ቀጣዮቹ ሩጫዎች በሰከንዱ ልክ 07:46:00 እና 07:48:00 ላይ ወደቁ። ደቂቃው አስፈላጊ ሲሆን ያዘጋጁት፤ ለሌሊት ባክአፕ ነባሪውን ይተዉት።

RandomizedDelaySec=10m ሆን ብሎ ተቃራኒውን ያደርጋል፦ አሥር ሰርቨሮች በአንድ ሰከንድ አንዱን የባክአፕ ማከማቻ እንዳይመቱ መጀመሪያውን በመስኮት ውስጥ ያሰራጫል።

ለአንድ ጊዜ ሥራ ምንም ፋይል አያስፈልግም፦

sudo systemd-run --on-active=30m --unit=cleanup-once /usr/local/bin/cleanup.sh

አንድ ጊዜ ሠርቶ የሚጠፋ ጊዜያዊ ታይመር ይፈጥራል፤ እስከዚያ systemctl list-timers ያሳየዋል።

3. የትኛውን መጠቀም

cronsystemd ታይመር
ማዋቀር1 መስመር2 ፋይሎች
ሎጎችውጤቱን ካዞሩ ብቻjournalctl -u name.service
ሰርቨሩ ጠፍቶ ሳለ ያመለጠ ሩጫይጠፋልበPersistent=true ሲነሳ ይሠራል
ሥራው በቀጣዩ ጊዜ አሁንም እየሠራ ነውሁለተኛ ቅጂ ይጀምራልየመጀመሪያው እስኪጨርስ ይዘለላል
ትክክለኛ ሰዓትእስከ ደቂቃበAccuracySec=1s እስከ ሰከንድ
ሁኔታየለምlist-timers፣ systemctl status

በአንድ ዓመት ውስጥ የሚያውቁትን ፈጣን መስመር ለማግኘት cron ይጠቀሙ። ውድቀቱን ማየት ለሚያስፈልግዎ፣ መደራረብ ለሌለበት ወይም ካመለጠ ዳግም ማስነሳት በኋላ መሥራት ላለበት ነገር ሁሉ ታይመር ይጠቀሙ፦ ባክአፖች፣ የሰርተፊኬት እድሳት፣ የዳታቤዝ ጽዳት። የcron ሥራ ሊደራረብ ከቻለ ይጠቅልሉት፦ flock -n /tmp/backup.lock /usr/local/bin/backup.sh፣ ሁለተኛው ቅጂ ወዲያውኑ ይወጣል።

ሁለቱም መርሐግብር አውጪዎች ሥራ ያስጀምራሉ ከዚያም ይቆማሉ። ሌት ተቀን መሥራት ያለበትና ከብልሽት በኋላ የሚመለስ ፕሮግራም መርሐግብር ሳይሆን አገልግሎት ያስፈልገዋል፤ የsystemd አገልግሎት እንዴት እንደሚፈጠር እና ለWindows በWindows Server ላይ ስክሪፕትን 24/7 ማስኬድ ይመልከቱ። ጥሩ የመጀመሪያ ታይመር ከrestic የባክአፕ መመሪያችን ያለው ነው፤ ራስ-ሰር የደህንነት ዝማኔዎች Ubuntu አስቀድሞ የሚያመጣው ታይመር ናቸው፣ apt-daily-upgrade.timer፣ በአዲስ ሰርቨር ላይ ከሚሠሩት 17ቱ አንዱ።

FAQ

ሥራዬ በተርሚናል ይሠራል፣ በcron ግን አይሠራም፤ ለምን?

ሦስት የተለመዱ ምክንያቶች። cron ሥራውን በbash ሳይሆን በsh ያስኪዳል፣ ስለዚህ የbash ብቻ አገባብ አይሳካም። በhome ማውጫዎ የተጫኑ እንደ nvm፣ pipx ወይም cargo ያሉ መሣሪያዎች በcron PATH ውስጥ የሉም፣ ስለዚህ ሙሉ ዱካዎችን ይጠቀሙ። እና በትዕዛዝ መስመሩ ውስጥ ያለ ማንኛውም % ትዕዛዙን ያቋርጣል፦ በእኛ ሰርቨር ላይ date +%F ወደ date + ተቀየረ። እንደ \% ይጻፉት ወይም ትዕዛዙን ወደ ስክሪፕት ያዛውሩት።

የcron ውጤት ወዴት ይሄዳል?

በነባሪ ወደ ኢሜይል። የእኛ ኢሜጅ የመልእክት ሰርቨር የለውም፣ ስለዚህ cron 'No MTA installed, discarding output' ብሎ ይመዘግባል እና ውጤቱ ይጠፋል። ለሥራው >> /var/log/myjob.log 2>&1 ያክሉ፣ ወይም ውጤቱ በራሱ ወደ journal ወደሚገባው የsystemd ታይመር ይቀይሩ።

የsystemd ታይመር ከcron የሚሻለው በምንድን ነው?

በjournalctl ውስጥ ሎጎች፣ አሁንም እየሠራ ያለ ሥራ ሁለተኛ ቅጂ አለመጀመሩ፣ ሰርቨሩ ጠፍቶ ሳለ ያመለጡ ሩጫዎችን በPersistent=true ማካካስ፣ እና ቀጣዩንና የመጨረሻውን ሩጫ የሚያሳይ የሁኔታ መስመር። cron በአጭርነት ያሸንፋል፦ ከሁለት ፋይሎች ይልቅ አንድ መስመር።

ታይመሬ በ18 ሰከንድ ዘግይቶ ሠራ። ለምን?

በነባሪ systemd የስርዓት መነቃቃትን ለመቀነስ ታይመሮችን በአንድ ደቂቃ መስኮት ውስጥ ያሰባስባል፤ ይህ AccuracySec ቅንብር ነው። በየሁለት ደቂቃው የሚሠራው ታይመራችን ከ07:42:00 ይልቅ በ07:42:18 ሠራ። በAccuracySec=1s ልክ በ07:46:00 ሠራ። ትክክለኛው ደቂቃ አስፈላጊ ሲሆን ያዘጋጁት።

cron እና ታይመሮች የትኛውን የሰዓት ዞን ይጠቀማሉ?

የሰርቨሩን፣ በኢሜጆቻችን ላይ UTC ነው። በtimedatectl አንድ ጊዜ ያዘጋጁት፣ የሆስት ስምና የሰዓት ዞን መመሪያችንን ይመልከቱ፣ cron እና ታይመሮች ይከተሉታል። ታይመር የራሱን ዞን ሊይዝም ይችላል፦ OnCalendar=*-*-* 03:00 Europe/Kyiv በሙከራችን በ01:00 UTC ሠራ።

አስተያየቶች

እስካሁን አስተያየቶች የሉም። መጀመሪያ ይሁኑ።

አስተያየት ይተዉ

አስተያየቶች ከመታየታቸው በፊት ይጣራሉ።