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، ستاسو په کور فولډر کې او له محدود چاپېریال سره چلوي. په Ubuntu 24.04 کې PATH له خپل شهرت ښه ووت: د سیسټم بشپړه لاره په شمول د /usr/local/bin او /snap/bin، د root او عادي کاروونکي دواړو لپاره. هغه څه چې لا هم نشته د کور فولډر لاندې هر څه دي: ~/.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 او د میاشتې په لومړۍ نېټه په 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د هرې میاشتې په لومړۍ نېټه په 04:00
*-*-* 03:00 Europe/Kyivد کیف په وخت 03:00؛ زموږ په ازموینه کې په 01:00 UTC وچلېد

درې تنظیمات چې پوهېدل یې ارزښت لري. Persistent=true وروستی چلول په ډیسک کې ساتي او هغه چلول پوره کوي چې د سرور د بندېدو یا د ټایمر د درېدو پر مهال پاتې شوی وي. موږ خپل هرې دوه دقیقې ټایمر ودراوه، صبر مو وکړ چې یو مهالوېش شوی چلول تېر شي، او بیا مو پیل کړ: پاتې چلول په همغه ثانیه کې پیل شو. له Persistent پرته ټایمر یوازې بلې نوبت ته انتظار باسي.

AccuracySec اصلي حیرانتیا ده. په ډیفالټ ډول systemd ټایمرونه د یوې دقیقې په کړکۍ کې یو ځای کوي څو سیسټم لږ راویښ کړي، له همدې امله زموږ لومړی چلول په 07:42:18 راغی، نه په 07:42:00. له 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 ټایمرونو څخه یو.

پوښتنې

ولې مې دنده په ټرمینل کې کار کوي خو په cron کې نه؟

درې عام لاملونه. cron دنده د bash پر ځای په sh چلوي، نو یوازې د bash نحو ناکامېږي. په کور فولډر کې نصب شوې وسیلې لکه nvm، pipx یا cargo د cron په PATH کې نه دي، نو بشپړې لارې وکاروئ. او د کمانډ په کرښه کې هر % کمانډ پای ته رسوي: زموږ په سرور کې date +%F په date + بدل شو. هغه د \% په توګه ولیکئ یا کمانډ سکریپټ ته ولېږدوئ.

د cron وتنه چېرته ځي؟

په ډیفالټ ډول برېښنالیک ته. زموږ امېج د برېښنالیک سرور نه لري، نو cron لیکي 'No MTA installed, discarding output' او وتنه ورکېږي. دندې ته >> /var/log/myjob.log 2>&1 ورزیات کړئ، یا systemd ټایمر ته واوړئ چې وتنه یې پخپله journal ته ځي.

د 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 وچلېد.

تبصرې

لا تبصرې نشته. لومړی اوسئ.

یوه تبصره پریږدئ

تبصرې د ښکاره کیدو مخکې اعتدال کیږي.