{"id":1989,"date":"2025-11-17T21:24:17","date_gmt":"2025-11-17T18:24:17","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/cron-mu-systemd-timer-mi-neden-nasil-ve-ne-zaman-hangisini-secmeli\/"},"modified":"2025-11-17T21:24:17","modified_gmt":"2025-11-17T18:24:17","slug":"cron-mu-systemd-timer-mi-neden-nasil-ve-ne-zaman-hangisini-secmeli","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/cron-mu-systemd-timer-mi-neden-nasil-ve-ne-zaman-hangisini-secmeli\/","title":{"rendered":"cron mu systemd Timer m\u0131? Neden, Nas\u0131l ve Ne Zaman Hangisini Se\u00e7meli?"},"content":{"rendered":"<div class=\"dchost-blog-content-wrapper\"><div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">\u0130&ccedil;indekiler<\/p><ul class=\"toc_list\"><li><a href=\"#Ofiste_Bir_Sabah_Bir_Cron_Kaydi_Bir_Sessizlik_ve_Bir_Fark_Edis\"><span class=\"toc_number toc_depth_1\">1<\/span> Ofiste Bir Sabah: Bir Cron Kayd\u0131, Bir Sessizlik ve Bir Fark Edi\u015f<\/a><\/li><li><a href=\"#Zamanlanmis_Isler_Neden_Kirilir_Kucuk_Taslar_Buyuk_Dalgalar\"><span class=\"toc_number toc_depth_1\">2<\/span> Zamanlanm\u0131\u015f \u0130\u015fler Neden K\u0131r\u0131l\u0131r? K\u00fc\u00e7\u00fck Ta\u015flar, B\u00fcy\u00fck Dalgalar<\/a><ul><li><a href=\"#Gorunmez_Varsayimlar\"><span class=\"toc_number toc_depth_2\">2.1<\/span> G\u00f6r\u00fcnmez Varsay\u0131mlar<\/a><\/li><li><a href=\"#Cakisan_Calismalar\"><span class=\"toc_number toc_depth_2\">2.2<\/span> \u00c7ak\u0131\u015fan \u00c7al\u0131\u015fmalar<\/a><\/li><li><a href=\"#Kacan_Araliklar\"><span class=\"toc_number toc_depth_2\">2.3<\/span> Ka\u00e7an Aral\u0131klar<\/a><\/li><\/ul><\/li><li><a href=\"#Cronun_Sade_Dunyasi_Basit_Hizli_Ama_Birkac_Tuzakla\"><span class=\"toc_number toc_depth_1\">3<\/span> Cron\u2019un Sade D\u00fcnyas\u0131: Basit, H\u0131zl\u0131, Ama Birka\u00e7 Tuzakla<\/a><ul><li><a href=\"#Bir_Klasik_crontab\"><span class=\"toc_number toc_depth_2\">3.1<\/span> Bir Klasik: crontab<\/a><\/li><\/ul><\/li><li><a href=\"#systemd_Timerlarin_Dunyasi_Bir_Tik_Daha_Sefkatli_Otomasyon\"><span class=\"toc_number toc_depth_1\">4<\/span> systemd Timer\u2019lar\u0131n D\u00fcnyas\u0131: Bir T\u0131k Daha \u015eefkatli Otomasyon<\/a><ul><li><a href=\"#Timer_Service_Ikili_Yapi\"><span class=\"toc_number toc_depth_2\">4.1<\/span> Timer + Service: \u0130kili Yap\u0131<\/a><\/li><li><a href=\"#Ortam_ve_Gunlukler\"><span class=\"toc_number toc_depth_2\">4.2<\/span> Ortam ve G\u00fcnl\u00fckler<\/a><\/li><li><a href=\"#Kosullar_ve_Bagimliliklar\"><span class=\"toc_number toc_depth_2\">4.3<\/span> Ko\u015fullar ve Ba\u011f\u0131ml\u0131l\u0131klar<\/a><\/li><li><a href=\"#Bizim_Script_Hala_Bizim_Esneklik\"><span class=\"toc_number toc_depth_2\">4.4<\/span> \u201cBizim Script H\u00e2l\u00e2 Bizim\u201d: Esneklik<\/a><\/li><\/ul><\/li><li><a href=\"#Saglam_Desenler_Kilit_Idempotent_Yeniden_Deneme_Saglik_Nabzi\"><span class=\"toc_number toc_depth_1\">5<\/span> Sa\u011flam Desenler: Kilit, Idempotent, Yeniden Deneme, Sa\u011fl\u0131k Nabz\u0131<\/a><ul><li><a href=\"#Kilit_ve_Cakisma_Yonetimi\"><span class=\"toc_number toc_depth_2\">5.1<\/span> Kilit ve \u00c7ak\u0131\u015fma Y\u00f6netimi<\/a><\/li><li><a href=\"#Idempotent_Davranis\"><span class=\"toc_number toc_depth_2\">5.2<\/span> Idempotent Davran\u0131\u015f<\/a><\/li><li><a href=\"#Yeniden_Deneme_ve_Geri_Basinc\"><span class=\"toc_number toc_depth_2\">5.3<\/span> Yeniden Deneme ve Geri Bas\u0131n\u00e7<\/a><\/li><li><a href=\"#Healthcheck_Nabzi_Oldu_mu_Olmadi_mi\"><span class=\"toc_number toc_depth_2\">5.4<\/span> Healthcheck Nabz\u0131: Oldu mu, Olmad\u0131 m\u0131?<\/a><\/li><li><a href=\"#Gunlukler_ve_Ayiklama\"><span class=\"toc_number toc_depth_2\">5.5<\/span> G\u00fcnl\u00fckler ve Ay\u0131klama<\/a><\/li><\/ul><\/li><li><a href=\"#Gercek_Hayattan_Senaryolar_Mesela_Soyle_Dusunun\"><span class=\"toc_number toc_depth_1\">6<\/span> Ger\u00e7ek Hayattan Senaryolar: \u201cMesela \u015e\u00f6yle D\u00fc\u015f\u00fcn\u00fcn\u201d<\/a><ul><li><a href=\"#SSL_Yenileme_Kacarsa_Usutur\"><span class=\"toc_number toc_depth_2\">6.1<\/span> SSL Yenileme: Ka\u00e7arsa \u00dc\u015f\u00fct\u00fcr<\/a><\/li><li><a href=\"#Veritabani_Yedekleri_Sessiz_Kahramanlar\"><span class=\"toc_number toc_depth_2\">6.2<\/span> Veritaban\u0131 Yedekleri: Sessiz Kahramanlar<\/a><\/li><li><a href=\"#Canary_Yayin_Sagliga_Bak_Sonra_Yayginlastir\"><span class=\"toc_number toc_depth_2\">6.3<\/span> Canary Yay\u0131n: Sa\u011fl\u0131\u011fa Bak, Sonra Yayg\u0131nla\u015ft\u0131r<\/a><\/li><li><a href=\"#Kume_Yasami_Kalbin_Attigi_Yer\"><span class=\"toc_number toc_depth_2\">6.4<\/span> K\u00fcme Ya\u015fam\u0131: Kalbin Att\u0131\u011f\u0131 Yer<\/a><\/li><li><a href=\"#Felaket_Dayanikliligi_Nabizsiz_Gece_Olmasin\"><span class=\"toc_number toc_depth_2\">6.5<\/span> Felaket Dayan\u0131kl\u0131l\u0131\u011f\u0131: Nab\u0131zs\u0131z Gece Olmas\u0131n<\/a><\/li><\/ul><\/li><li><a href=\"#cron_mu_systemd_Timer_mi_Ne_Zaman_Hangisi_Daha_Dogal_Hisseder\"><span class=\"toc_number toc_depth_1\">7<\/span> cron mu systemd Timer m\u0131? Ne Zaman Hangisi Daha Do\u011fal Hisseder?<\/a><ul><li><a href=\"#Sadelik_Ariyorsaniz\"><span class=\"toc_number toc_depth_2\">7.1<\/span> Sadelik Ar\u0131yorsan\u0131z<\/a><\/li><li><a href=\"#Guvenilirlik_Telafi_ve_Gozlem_Istiyorsaniz\"><span class=\"toc_number toc_depth_2\">7.2<\/span> G\u00fcvenilirlik, Telafi ve G\u00f6zlem \u0130stiyorsan\u0131z<\/a><\/li><li><a href=\"#Ikisinin_Yan_Yana_Yasamasi\"><span class=\"toc_number toc_depth_2\">7.3<\/span> \u0130kisinin Yan Yana Ya\u015famas\u0131<\/a><\/li><\/ul><\/li><li><a href=\"#Uctan_Uca_Ornek_Yedekle_Kontrol_Et_Bildir\"><span class=\"toc_number toc_depth_1\">8<\/span> U\u00e7tan Uca \u00d6rnek: Yedekle, Kontrol Et, Bildir<\/a><ul><li><a href=\"#Dosya_Duzeni\"><span class=\"toc_number toc_depth_2\">8.1<\/span> Dosya D\u00fczeni<\/a><\/li><\/ul><\/li><li><a href=\"#Healthcheck_Izleme_Pano_Alarm_ve_Huzur\"><span class=\"toc_number toc_depth_1\">9<\/span> Healthcheck \u0130zleme: Pano, Alarm ve Huzur<\/a><ul><li><a href=\"#Kalp_Atisini_Gormek\"><span class=\"toc_number toc_depth_2\">9.1<\/span> Kalp At\u0131\u015f\u0131n\u0131 G\u00f6rmek<\/a><\/li><li><a href=\"#Basarisizliktan_Ogrenme\"><span class=\"toc_number toc_depth_2\">9.2<\/span> Ba\u015far\u0131s\u0131zl\u0131ktan \u00d6\u011frenme<\/a><\/li><li><a href=\"#Belgeleme_ve_Runbook\"><span class=\"toc_number toc_depth_2\">9.3<\/span> Belgeleme ve Runbook<\/a><\/li><\/ul><\/li><li><a href=\"#Surprizler_Icin_Kucuk_Hileler\"><span class=\"toc_number toc_depth_1\">10<\/span> S\u00fcrprizler \u0130\u00e7in K\u00fc\u00e7\u00fck Hileler<\/a><ul><li><a href=\"#Calendar_Ifadeleri_ile_Incelik\"><span class=\"toc_number toc_depth_2\">10.1<\/span> Calendar \u0130fadeleri ile \u0130ncelik<\/a><\/li><li><a href=\"#Ad_Hoc_Calistirma\"><span class=\"toc_number toc_depth_2\">10.2<\/span> Ad Hoc \u00c7al\u0131\u015ft\u0131rma<\/a><\/li><li><a href=\"#cron_Kullanmaya_Devam_Edenlere_Minik_Hatirlatma\"><span class=\"toc_number toc_depth_2\">10.3<\/span> cron Kullanmaya Devam Edenlere Minik Hat\u0131rlatma<\/a><\/li><\/ul><\/li><li><a href=\"#Kapanis_Guvenilirlik_Kucuk_Jestlerin_Toplamidir\"><span class=\"toc_number toc_depth_1\">11<\/span> Kapan\u0131\u015f: G\u00fcvenilirlik, K\u00fc\u00e7\u00fck Jestlerin Toplam\u0131d\u0131r<\/a><\/li><\/ul><\/div>\n<h2 id=\"section-1\"><span id=\"Ofiste_Bir_Sabah_Bir_Cron_Kaydi_Bir_Sessizlik_ve_Bir_Fark_Edis\">Ofiste Bir Sabah: Bir Cron Kayd\u0131, Bir Sessizlik ve Bir Fark Edi\u015f<\/span><\/h2>\n<p>Hi\u00e7 ba\u015f\u0131n\u0131za geldi mi? Bir sabah ofise girersiniz, kahveyi koyars\u0131n\u0131z, monit\u00f6r\u00fcn kar\u015f\u0131s\u0131na ge\u00e7er ve \u201cd\u00fcn gece yedekleme \u00e7al\u0131\u015ft\u0131 m\u0131?\u201d diye hafif bir i\u00e7 \u015f\u00fcpheyle bakars\u0131n\u0131z. Benim ba\u015f\u0131ma bu, tahmin etti\u011fimden daha fazla geldi. Bir seferinde kritik bir yedekleme i\u015fi, g\u00fcnlerdir sessiz sedas\u0131z patl\u0131yormu\u015f; ne mail gelmi\u015f, ne alarm \u00e7alm\u0131\u015f. Cron kayd\u0131nda minicik bir <strong>PATH<\/strong> detay\u0131 y\u00fcz\u00fcnden komut bulunamam\u0131\u015f. \u0130\u015fte o sabah d\u00fc\u015f\u00fcnd\u00fcm ki, zamanlanm\u0131\u015f i\u015fler sanki g\u00f6r\u00fcnmez bir di\u015fli gibi d\u00f6n\u00fcyor ama bir di\u015f atlay\u0131nca kimse duymuyor. Sonra bir arkada\u015f \u201cNeden <strong>systemd timer<\/strong> denemiyorsun?\u201d dedi. O g\u00fcn bir ampul yand\u0131. <\/p>\n<p>Bu yaz\u0131da, cron ile systemd timer\u2019lar\u0131n g\u00fcnl\u00fck hayattaki halleri \u00fczerinden gidece\u011fiz. Hangisini, ne zaman, nas\u0131l kullan\u0131nca g\u00f6nl\u00fcn\u00fcz rahat eder, onu konu\u015faca\u011f\u0131z. Sadece teknik c\u00fcmleler de\u011fil; \u00f6rnek unit dosyalar\u0131, k\u00fc\u00e7\u00fck script\u2019ler, <strong>healthcheck<\/strong> pingi, <strong>kilitleme<\/strong>, <strong>yeniden deneme<\/strong> ve \u201cunutursam, ka\u00e7an i\u015fleri yakalar m\u0131?\u201d gibi sorulara da dokunaca\u011f\u0131m. Mesela \u015f\u00f6yle d\u00fc\u015f\u00fcn\u00fcn: Gece yar\u0131s\u0131 bir yedek alacaks\u0131n\u0131z, a\u011f bir an gidip gelebilir, disk belli bir s\u00fcre yo\u011fun olabilir. Bu d\u00fcnyan\u0131n do\u011fas\u0131 b\u00f6yle. Mesele \u015fu: Zamanlay\u0131c\u0131n\u0131z bu ini\u015f \u00e7\u0131k\u0131\u015flar\u0131 <strong>m\u00fcsamaha<\/strong> ile kar\u015f\u0131layabiliyor mu? Ben de tam bunu anlatmak istiyorum.<\/p>\n<h2 id=\"section-2\"><span id=\"Zamanlanmis_Isler_Neden_Kirilir_Kucuk_Taslar_Buyuk_Dalgalar\">Zamanlanm\u0131\u015f \u0130\u015fler Neden K\u0131r\u0131l\u0131r? K\u00fc\u00e7\u00fck Ta\u015flar, B\u00fcy\u00fck Dalgalar<\/span><\/h2>\n<h3><span id=\"Gorunmez_Varsayimlar\">G\u00f6r\u00fcnmez Varsay\u0131mlar<\/span><\/h3>\n<p>Zamanlanm\u0131\u015f i\u015flerin en b\u00fcy\u00fck d\u00fc\u015fman\u0131, g\u00f6r\u00fcnmez varsay\u0131mlar. Cron, varsay\u0131lan ortam de\u011fi\u015fkenleri \u00e7ok k\u0131s\u0131tl\u0131 oldu\u011fu i\u00e7in, terminalde \u00e7al\u0131\u015fan komut geceleri cron\u2019da \u00e7al\u0131\u015fmayabiliyor. \u201cBen bunu elle \u00e7al\u0131\u015ft\u0131r\u0131nca oluyor\u201d c\u00fcmlesi genelde buradan gelir. <strong>PATH<\/strong> dar, <strong>HOME<\/strong> bekledi\u011finiz gibi de\u011fil, locale ayarlar\u0131 yok. Script\u2019iniz tam yoldan ba\u011f\u0131ms\u0131z davranm\u0131yorsa, bir anda gece ko\u015fullar\u0131nda t\u0131kan\u0131r.<\/p>\n<h3><span id=\"Cakisan_Calismalar\">\u00c7ak\u0131\u015fan \u00c7al\u0131\u015fmalar<\/span><\/h3>\n<p>Bir i\u015f uzarsa ve yeni tetikleme ayn\u0131 anda gelirse, iki kopya ayn\u0131 veritaban\u0131na sar\u0131l\u0131p kalabilir. Bir yedek hala s\u00fcrerken ikinci yedek ba\u015flarsa, IO\u2019yu g\u00f6mebilirsiniz. Dosyalar\u0131n \u00fcst\u00fcne yaz\u0131labilir, kilit mekanizmas\u0131 yoksa veri yar\u0131m kal\u0131r. \u0130ki i\u015flem birbirini bo\u011far ve sabah \u201cneden bu kadar yava\u015f?\u201d diye kendinizi sorgularken bulursunuz.<\/p>\n<h3><span id=\"Kacan_Araliklar\">Ka\u00e7an Aral\u0131klar<\/span><\/h3>\n<p>Makine gece kapal\u0131ysa veya yeniden ba\u015fl\u0131yorsa, 03:00\u2019deki i\u015f ka\u00e7ar. Baz\u0131 senaryolarda bu sorun de\u011fil; bazen de ertesi g\u00fcn yoklama listesinde b\u00fcy\u00fck bir bo\u015fluk demek. \u201cD\u00fcn \u00e7al\u0131\u015fmad\u0131ysa ilk a\u00e7\u0131l\u0131\u015fta telafi et\u201d gibi bir <strong>kal\u0131c\u0131l\u0131k<\/strong> beklentisi do\u011far. Ve burada hangisini se\u00e7ece\u011fimiz sorusu yava\u015f yava\u015f netle\u015fir.<\/p>\n<h2 id=\"section-3\"><span id=\"Cronun_Sade_Dunyasi_Basit_Hizli_Ama_Birkac_Tuzakla\">Cron\u2019un Sade D\u00fcnyas\u0131: Basit, H\u0131zl\u0131, Ama Birka\u00e7 Tuzakla<\/span><\/h2>\n<h3><span id=\"Bir_Klasik_crontab\">Bir Klasik: crontab<\/span><\/h3>\n<p>Cron, basit oldu\u011fu i\u00e7in seviliyor. Bir sat\u0131r yazars\u0131n\u0131z, belirli dakikalarda tetikler. Mesela saat 03:15\u2019te g\u00fcnl\u00fck yedek almak i\u00e7in \u015f\u00f6yle bir kay\u0131t d\u00fc\u015f\u00fclebilir:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># crontab -e\n15 3 * * * \/usr\/local\/bin\/backup.sh &gt;\/var\/log\/backup.log 2&gt;&amp;1\n<\/code><\/pre>\n<p>Bu kadar yal\u0131n bir d\u00fcnyada i\u015fler y\u00fcr\u00fcyor. Fakat bu yal\u0131nl\u0131\u011f\u0131n bir bedeli var. Ortam de\u011fi\u015fkenleri neredeyse bo\u015f. Bu y\u00fczden komutlar\u0131n\u0131z i\u00e7in ya <strong>mutlak yollar<\/strong> kullanman\u0131z ya da crontab\u2019\u0131n ba\u015f\u0131na PATH ve benzeri de\u011fi\u015fkenleri a\u00e7\u0131k\u00e7a yazman\u0131z gerekiyor.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">PATH=\/usr\/local\/sbin:\/usr\/local\/bin:\/usr\/sbin:\/usr\/bin:\/sbin:\/bin\nMAILTO=&quot;&quot;\nSHELL=\/bin\/bash\n<\/code><\/pre>\n<p>Bir de \u00e7ak\u0131\u015fma meselesi var. \u201cBir anda iki yedekleme \u00e7al\u0131\u015fmas\u0131n\u201d diyorsan\u0131z, k\u00fc\u00e7\u00fck bir kilit mekanizmas\u0131 kullanmak iyi geliyor. Bunun i\u00e7in <strong>flock<\/strong> \u00e7ok pratik:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">15 3 * * * flock -n \/var\/run\/backup.lock \/usr\/local\/bin\/backup.sh &gt;&gt;\/var\/log\/backup.log 2&gt;&amp;1\n<\/code><\/pre>\n<p>Bu sayede kilit dosyas\u0131 varken ikinci kopya ba\u015flamaz. E\u011fer bir de ba\u015far\u0131s\u0131zl\u0131k olursa haberiniz olsun istiyorsan\u0131z, cron\u2019un e-posta \u00f6zelli\u011fi var ama herkes posta sunucusu kurmak istemiyor. Yine de basit bir <strong>curl<\/strong> ping\u2019i ile d\u0131\u015far\u0131ya \u201coldu\/olmad\u0131\u201d diye haber u\u00e7urabilirsiniz. Bunun i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131 servisler var; \u00f6rne\u011fin <a href=\"https:\/\/healthchecks.io\" rel=\"nofollow noopener\" target=\"_blank\">healthchecks.io<\/a>, ba\u015far\u0131larda ve hatalarda ayr\u0131 URL\u2019lere ping atman\u0131za izin veriyor. \u201cNe zamand\u0131r ko\u015fmad\u0131?\u201d diye bir tahta gibi g\u00f6rebilmek insan\u0131n i\u00e7ini ferahlat\u0131yor.<\/p>\n<p>cron\u2019un g\u00fczel yan\u0131, sistemin d\u0131\u015f\u0131nda bir d\u00fcnya kurmamas\u0131. Sadece tetikleme yap\u0131yor, gerisi size kal\u0131yor. Bu \u00f6zg\u00fcrl\u00fck tatl\u0131, ama baz\u0131 durumlarda biraz fazla \u00f6zg\u00fcr. G\u00fcn\u00fcn sonunda, <strong>g\u00f6z\u00fcn\u00fcz\u00fcn \u00fcst\u00fcnde bir g\u00f6z<\/strong> ar\u0131yorsan\u0131z, orada systemd timer\u2019lar devreye giriyor.<\/p>\n<p>Daha sa\u011flam yedek alma senaryolar\u0131n\u0131 seviyorsan\u0131z, uygulama-tutarl\u0131l\u0131\u011f\u0131 ve dondurma\/\u00e7\u00f6zme ak\u0131\u015f\u0131n\u0131 anlatt\u0131\u011f\u0131m detayl\u0131 rehber, zamanlanm\u0131\u015f i\u015flerin nas\u0131l hassasla\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 da \u00e7a\u011fr\u0131\u015ft\u0131r\u0131r: <a href=\"https:\/\/www.dchost.com\/blog\/uygulama%e2%80%91tutarli-yedekler-nasil-alinir-lvm-snapshot-ve-fsfreeze-ile-mysql-postgresqli-usutmeden-dondurmak\/\">LVM snapshot ve fsfreeze ile uygulama\u2011tutarl\u0131 yedekler<\/a>.<\/p>\n<h2 id=\"section-4\"><span id=\"systemd_Timerlarin_Dunyasi_Bir_Tik_Daha_Sefkatli_Otomasyon\">systemd Timer\u2019lar\u0131n D\u00fcnyas\u0131: Bir T\u0131k Daha \u015eefkatli Otomasyon<\/span><\/h2>\n<h3><span id=\"Timer_Service_Ikili_Yapi\">Timer + Service: \u0130kili Yap\u0131<\/span><\/h3>\n<p>systemd timer\u2019lar, i\u015fin tetikleyicisi ile i\u015fin kendisini ayr\u0131 d\u00fc\u015f\u00fcn\u00fcyor. Bir <strong>service<\/strong> unit, bir de <strong>timer<\/strong> unit. Bu ayr\u0131m ilk ba\u015fta formal g\u00f6r\u00fcnebilir ama pratikte \u00e7ok rahatlat\u0131c\u0131. \u00c7al\u0131\u015fma ortam\u0131n\u0131, g\u00fcnl\u00fckleri, kaynak s\u0131n\u0131rlar\u0131n\u0131, ba\u015far\u0131s\u0131zl\u0131kta davran\u0131\u015f\u0131 servis taraf\u0131nda y\u00f6netir; tetikleme saatlerini timer taraf\u0131nda ayarlars\u0131n\u0131z.<\/p>\n<p>Mesela g\u00fcnl\u00fck yedekleme i\u00e7in bir servis tan\u0131m\u0131 \u015f\u00f6yle olabilir:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">[Unit]\nDescription=Gece Yedekleme \u0130\u015fi\nWants=network-online.target\nAfter=network-online.target\n\n[Service]\nType=oneshot\nEnvironmentFile=\/etc\/backup.env\nExecStart=\/usr\/local\/bin\/backup.sh\nWorkingDirectory=\/var\/lib\/backup\nUser=backup\nGroup=backup\n# Kaynaklar\u0131 terbiye etmek rahatlat\u0131r\nNice=10\nIOSchedulingClass=best-effort\nIOSchedulingPriority=7\n# Loglar journald'a d\u00fc\u015fer\nStandardOutput=journal\nStandardError=journal\n# Ba\u015far\u0131s\u0131zl\u0131kta yeniden deneme i\u00e7in basit kural\nRestart=on-failure\nRestartSec=30s\n\n[Install]\nWantedBy=multi-user.target\n<\/code><\/pre>\n<p>Ve bunun zamanlay\u0131c\u0131s\u0131:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">[Unit]\nDescription=Gece Yedekleme Zamanlay\u0131c\u0131s\u0131\n\n[Timer]\nOnCalendar=03:15\nPersistent=true\nRandomizedDelaySec=2m\nUnit=backup.service\n\n[Install]\nWantedBy=timers.target\n<\/code><\/pre>\n<p><strong>Persistent=true<\/strong> en sevdi\u011fimlerden. Makine 03:15\u2019te kapal\u0131yd\u0131 diyelim; a\u00e7\u0131ld\u0131\u011f\u0131nda \u201cen son ne zaman \u00e7al\u0131\u015ft\u0131rm\u0131\u015ft\u0131m?\u201d diye bakar ve ka\u00e7an i\u015fi telafi eder. <strong>RandomizedDelaySec<\/strong> ise \u00e7ok say\u0131da sunucunuz varsa hepsinin ayn\u0131 anda IO\u2019ya abanmas\u0131n\u0131 engeller. K\u00fc\u00e7\u00fck bir gecikme, b\u00fcy\u00fck bir nefes.<\/p>\n<p>Timer ifadeleri de esnek. \u201cHer be\u015f dakikada bir ama ilk boot\u2019tan bir dakika sonra\u201d gibi kal\u0131plar kolay. \u201cG\u00fcnde bir, ama pazarlar\u0131 de\u011fil\u201d diyebiliyorsunuz. Ayr\u0131nt\u0131 merak ederseniz, resmi belgelerde g\u00fczel \u00f6rnekler var: <a href=\"https:\/\/www.freedesktop.org\/software\/systemd\/man\/latest\/systemd.timer.html\" rel=\"nofollow noopener\" target=\"_blank\">systemd.timer referans\u0131<\/a>.<\/p>\n<h3><span id=\"Ortam_ve_Gunlukler\">Ortam ve G\u00fcnl\u00fckler<\/span><\/h3>\n<p>systemd size <strong>EnvironmentFile<\/strong> ile tertemiz bir ortam sa\u011flama imk\u00e2n\u0131 veriyor. \u00dcstelik g\u00fcnl\u00fckler journald\u2019a d\u00fc\u015ft\u00fc\u011f\u00fc i\u00e7in \u201cne oldu, ne olmad\u0131\u201dy\u0131 tek yerden g\u00f6r\u00fcyorsunuz. \u201cMail server kuray\u0131m m\u0131?\u201d sorusu da mecburi olmaktan \u00e7\u0131k\u0131yor. journalctl ile tarihe, unit\u2019e g\u00f6re filtreleyip bakmak huzur veriyor.<\/p>\n<h3><span id=\"Kosullar_ve_Bagimliliklar\">Ko\u015fullar ve Ba\u011f\u0131ml\u0131l\u0131klar<\/span><\/h3>\n<p>Bir i\u015fin \u015febekeye ihtiya\u00e7 duydu\u011funu biliyorsan\u0131z, <strong>After=network-online.target<\/strong> ile s\u00f6ylemek \u00e7ok iyi. Bazen de \u201c\u015fu dosya yoksa hi\u00e7 u\u011fra\u015fma\u201d gibi ko\u015fullar yazmak isteyebilirsiniz. Bu detaylar, gece n\u00f6betinizde <strong>rastgele hatalar<\/strong> yerine kontroll\u00fc davran\u0131\u015f getiriyor. <\/p>\n<p>Timer\u2019larla birlikte bir de <strong>systemd-run<\/strong> var; \u201chemen \u015fimdi, ayn\u0131 servis kurallar\u0131yla bir kere \u00e7al\u0131\u015ft\u0131r\u201d dedi\u011finizde tek seferlik i\u015fler i\u00e7in muazzam. \u201cBirazdan bir sefer \u00e7al\u0131\u015fs\u0131n ve loglar\u0131 ayn\u0131 yere d\u00fc\u015fs\u00fcn\u201d demek i\u00e7in birebir.<\/p>\n<h3><span id=\"Bizim_Script_Hala_Bizim_Esneklik\">\u201cBizim Script H\u00e2l\u00e2 Bizim\u201d: Esneklik<\/span><\/h3>\n<p>En g\u00fczel taraf\u0131 \u015fu: Script\u2019inizi de\u011fi\u015ftirmek zorunda de\u011filsiniz. Hatta <strong>flock<\/strong> kilidi gibi al\u0131\u015fkanl\u0131klar\u0131n\u0131z\u0131 s\u00fcrd\u00fcrebilirsiniz. systemd, \u201cben sadece ko\u015fullar\u0131n\u0131 iyile\u015ftiriyorum\u201d diyor. O y\u00fczden cron\u2019dan timer\u2019a ge\u00e7i\u015f, \u00e7o\u011fu zaman birka\u00e7 unit dosyas\u0131 yazmak kadar basit oluyor.<\/p>\n<h2 id=\"section-5\"><span id=\"Saglam_Desenler_Kilit_Idempotent_Yeniden_Deneme_Saglik_Nabzi\">Sa\u011flam Desenler: Kilit, Idempotent, Yeniden Deneme, Sa\u011fl\u0131k Nabz\u0131<\/span><\/h2>\n<h3><span id=\"Kilit_ve_Cakisma_Yonetimi\">Kilit ve \u00c7ak\u0131\u015fma Y\u00f6netimi<\/span><\/h3>\n<p>\u0130\u015fler \u00e7ak\u0131\u015fmas\u0131n diye <strong>flock<\/strong> al\u0131\u015fkanl\u0131\u011f\u0131n\u0131 s\u00fcrd\u00fcrmek iyi fikir. Servis tan\u0131m\u0131na do\u011frudan eklemek m\u00fcmk\u00fcn. Mesela:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">[Service]\nType=oneshot\nExecStart=\/usr\/bin\/flock -n \/var\/run\/backup.lock \/usr\/local\/bin\/backup.sh\n<\/code><\/pre>\n<p>Bu sayede timer arka arkaya tetiklese bile ikinci i\u015f beklemeden elenir. G\u00fcn\u00fcn sonunda veriyi koruyan bu k\u00fc\u00e7\u00fcc\u00fck kilit, uykunuzu da koruyor.<\/p>\n<h3><span id=\"Idempotent_Davranis\">Idempotent Davran\u0131\u015f<\/span><\/h3>\n<p>\u201c\u0130ki kere \u00e7al\u0131\u015f\u0131rsa da sonu\u00e7 ayn\u0131 olsun\u201d prensibi alt\u0131n de\u011ferinde. Yedek dosyas\u0131na tarih eklemek, ge\u00e7ici dizin kullanmak, \u201cba\u015flad\u0131, s\u00fcr\u00fcyor, bitti\u201d gibi durum dosyalar\u0131 tutmak \u00e7ok i\u015f g\u00f6r\u00fcyor. Aksi halde, yar\u0131m kalan bir i\u015fin art\u0131klar\u0131, ertesi gecenin i\u015fini de sabote edebiliyor.<\/p>\n<h3><span id=\"Yeniden_Deneme_ve_Geri_Basinc\">Yeniden Deneme ve Geri Bas\u0131n\u00e7<\/span><\/h3>\n<p>Bazen hatay\u0131 kabullenmek de\u011fil, biraz sab\u0131r gerekir. A\u011f bir an d\u00fc\u015fer, u\u00e7 servis cevap vermez. Script i\u00e7ine <strong>basit bir yeniden deneme<\/strong> koymak \u00e7o\u011fu kez yeterli. K\u00fc\u00e7\u00fck bir \u00f6rnek:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">#!\/usr\/bin\/env bash\nset -euo pipefail\nattempts=0\nmax=5\nsleep_base=5\n\nuntil \/usr\/local\/bin\/backup_core.sh; do\n  attempts=$((attempts+1))\n  if [[ $attempts -ge $max ]]; then\n    echo &quot;denemeler t\u00fckendi&quot; &gt;&amp;2\n    exit 1\n  fi\n  sleep $((sleep_base * attempts))\n  echo &quot;yeniden deniyorum (#$attempts)&quot;\ndone\n<\/code><\/pre>\n<p>Bu k\u00fc\u00e7\u00fck geri bas\u0131n\u00e7, k\u0131sa s\u00fcreli sars\u0131nt\u0131larda i\u015fi kurtar\u0131r. systemd taraf\u0131nda da <strong>Restart=on-failure<\/strong> ve <strong>StartLimitIntervalSec\/StartLimitBurst<\/strong> gibi ayarlarla, i\u015fin panik halinde kendini k\u00f6r d\u00f6v\u00fc\u015f\u00fcne sokmas\u0131n\u0131 engelleyebilirsiniz.<\/p>\n<h3><span id=\"Healthcheck_Nabzi_Oldu_mu_Olmadi_mi\">Healthcheck Nabz\u0131: Oldu mu, Olmad\u0131 m\u0131?<\/span><\/h3>\n<p>Bir i\u015fi kurup unuttu\u011funuzda, unutulan \u015fey genellikle \u201cbiliyor muyum?\u201d sorusudur. Ben burada d\u0131\u015f bir healthcheck servisini seviyorum. Ba\u015far\u0131l\u0131 biti\u015fte bir <strong>success URL<\/strong>\u2019e, hata an\u0131nda bir <strong>fail URL<\/strong>\u2019e ping atmak kadar temiz bir geri bildirim az bulunur. Bir curl ile \u015fu hale gelir:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">#!\/usr\/bin\/env bash\nset -euo pipefail\nHC_OK=&quot;https:\/\/hc.example\/success-uuid&quot;\nHC_FAIL=&quot;https:\/\/hc.example\/fail-uuid&quot;\n\ntrap 'curl -fsS -m 10 &quot;$HC_FAIL&quot; &gt;\/dev\/null || true' ERR\n\n# i\u015f mant\u0131\u011f\u0131 buraya\n\/usr\/local\/bin\/backup_one_shot\n\ncurl -fsS -m 10 &quot;$HC_OK&quot; &gt;\/dev\/null || true\n<\/code><\/pre>\n<p>Ba\u015flang\u0131\u00e7ta bir \u201cstart ping\u201d atmak isterseniz, \u00fc\u00e7l\u00fc bir \u015fablon da var. B\u00f6ylece \u201cneden uzun s\u00fcrd\u00fc?\u201d diye merak etti\u011finizde gecikmenin nerede ba\u015flad\u0131\u011f\u0131n\u0131 bilirsiniz. Bunun i\u00e7in <a href=\"https:\/\/healthchecks.io\" rel=\"nofollow noopener\" target=\"_blank\">healthchecks.io<\/a> gibi servisler pratik bir pano sunuyor.<\/p>\n<h3><span id=\"Gunlukler_ve_Ayiklama\">G\u00fcnl\u00fckler ve Ay\u0131klama<\/span><\/h3>\n<p>Journald ile g\u00fcnl\u00fckler tek yerde. \u201cD\u00fcn 03:15\u2019te ne oldu?\u201d sorusuna cevap ararken \u015fu komut \u00e7ok i\u015f g\u00f6r\u00fcyor:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">journalctl -u backup.service --since &quot;2025-01-01&quot; --until &quot;2025-01-02&quot;\n<\/code><\/pre>\n<p>Yine de, baz\u0131lar\u0131 d\u00fcz dosya loglar\u0131n\u0131 da sever. O da m\u00fcmk\u00fcn. <strong>StandardOutput=append:\/var\/log\/backup.log<\/strong> gibi bir y\u00f6nlendirme ile dosyada birikmesini sa\u011flayabilirsiniz. Esneklik elinizde.<\/p>\n<h2 id=\"section-6\"><span id=\"Gercek_Hayattan_Senaryolar_Mesela_Soyle_Dusunun\">Ger\u00e7ek Hayattan Senaryolar: \u201cMesela \u015e\u00f6yle D\u00fc\u015f\u00fcn\u00fcn\u201d<\/span><\/h2>\n<h3><span id=\"SSL_Yenileme_Kacarsa_Usutur\">SSL Yenileme: Ka\u00e7arsa \u00dc\u015f\u00fct\u00fcr<\/span><\/h3>\n<p>Sertifikalar yenilenmezse bir sabah taray\u0131c\u0131lar ba\u011f\u0131r\u0131r. Yenileme i\u015fi s\u0131k aral\u0131klarla ve sa\u011flam yap\u0131lmal\u0131. Bu t\u00fcr i\u015fler, \u201cka\u00e7arsa a\u00e7\u0131l\u0131\u015fta telafi et\u201d \u00f6zelli\u011fiyle systemd timer\u2019da daha g\u00fcvenli hissedilir. \u00dcstelik ba\u015far\u0131s\u0131zl\u0131kta birka\u00e7 dakika sonra otomatik deneme rahatlat\u0131r. Sertifika otomasyonunu yedekli CA ile kurdu\u011funuz bir d\u00fczende bu daha da kritik. Bu ba\u011flamda, <a href=\"https:\/\/www.dchost.com\/blog\/acme-otomasyonunda-yedekli-ca-nasil-kurulur-acme-sh-ile-lets-encrypt-%e2%86%92-zerossl-fallback-oran-limitlerine-karsi-guvenli-olcekleme\/\">ACME otomasyonunda yedekli CA kurulumunu<\/a> biraz kurcalay\u0131n; zamanlay\u0131c\u0131y\u0131 nas\u0131l d\u00fc\u015f\u00fcnmeniz gerekti\u011fi konusunda fikir veriyor.<\/p>\n<h3><span id=\"Veritabani_Yedekleri_Sessiz_Kahramanlar\">Veritaban\u0131 Yedekleri: Sessiz Kahramanlar<\/span><\/h3>\n<p>Veritaban\u0131 yedekleri gecenin sessiz kahramanlar\u0131d\u0131r. IO\u2019nun sakin oldu\u011fu saatleri kollamak istersiniz ama i\u015fler bazen uzayabilir. systemd timer\u2019\u0131n <strong>RandomizedDelaySec<\/strong> \u00f6zelli\u011fi, \u00e7ok sunuculu ortamlarda ayn\u0131 anda abanmay\u0131 engelleyerek diskleri mutlu eder. A\u011f kopup gelirse, yeniden deneme ve kilitleme kombinasyonuyla sabaha sorun ta\u015f\u0131madan \u00e7\u0131kars\u0131n\u0131z.<\/p>\n<h3><span id=\"Canary_Yayin_Sagliga_Bak_Sonra_Yayginlastir\">Canary Yay\u0131n: Sa\u011fl\u0131\u011fa Bak, Sonra Yayg\u0131nla\u015ft\u0131r<\/span><\/h3>\n<p>Uygulama da\u011f\u0131t\u0131m\u0131 sonras\u0131 \u201ckalp at\u0131\u015f\u0131 normal mi?\u201dyi sormadan herkese yaymak cesur bir i\u015f. K\u00fc\u00e7\u00fck bir timera ba\u011fl\u0131 sa\u011fl\u0131k kontrol\u00fcyle, da\u011f\u0131t\u0131m penceresinde nab\u0131z tutmak ho\u015f oluyor. E\u011fer bu konu ilginizi \u00e7ekiyorsa, y\u00f6nlendirme ve sa\u011fl\u0131k kontrol\u00fcn\u00fc birlikte anlatt\u0131\u011f\u0131m \u015fu yaz\u0131 iyi gider: <a href=\"https:\/\/www.dchost.com\/blog\/vpste-canary-dagitimi-nasil-tatli-tatli-kurulur-nginx-agirlikli-yonlendirme-saglik-kontrolu-ve-guvenli-rollback\/\">VPS\u2019te canary da\u011f\u0131t\u0131m\u0131 ve sa\u011fl\u0131k kontrol\u00fc<\/a>.<\/p>\n<h3><span id=\"Kume_Yasami_Kalbin_Attigi_Yer\">K\u00fcme Ya\u015fam\u0131: Kalbin Att\u0131\u011f\u0131 Yer<\/span><\/h3>\n<p>K\u00fcme sistemlerinde arka planda d\u00f6nen i\u015fler \u00e7oktur: node temizli\u011fi, imaj g\u00fcncellemeleri, k\u00fc\u00e7\u00fck housekeeping g\u00f6revleri. Timer\u2019lar burada d\u00fczen getiriyor. \u201cHer node rastgele 10 dakika i\u00e7inde \u00e7al\u0131\u015fs\u0131n\u201d gibi bir davran\u0131\u015f, t\u00fcm k\u00fcmeye yumu\u015fak bir ritim verir. K\u00fcmelerle ilgili daha geni\u015f resim g\u00f6rmek isterseniz, <a href=\"https:\/\/www.dchost.com\/blog\/3-vps-ile-k3s-yuksek-erisilebilirlik-kumesi-traefik-cert%e2%80%91manager-ve-longhorn-ile-uretime-hazir-kurulum\/\">3 VPS ile K3s y\u00fcksek eri\u015filebilirlik<\/a> rehberini de seversiniz.<\/p>\n<h3><span id=\"Felaket_Dayanikliligi_Nabizsiz_Gece_Olmasin\">Felaket Dayan\u0131kl\u0131l\u0131\u011f\u0131: Nab\u0131zs\u0131z Gece Olmas\u0131n<\/span><\/h3>\n<p>\u0130\u015flerin hepsi tek merkezde ko\u015fuyorsa, bir aksama t\u00fcm ak\u0131\u015f\u0131 durdurur. Timer\u2019lar ve healthcheck pingiyle, uzak bir panoda \u201cbu gece kim ko\u015ftu, kim ko\u015fmad\u0131?\u201dy\u0131 g\u00f6rmek, felaket senaryolar\u0131ndan \u00f6nce k\u00fc\u00e7\u00fck aksakl\u0131klar\u0131 yakalat\u0131r. Mimarilerin dayan\u0131kl\u0131l\u0131k taraf\u0131n\u0131 merak edenler i\u00e7in \u015fu rehberler g\u00fczel bir e\u015flik\u00e7i oluyor: <a href=\"https:\/\/www.dchost.com\/blog\/cok-bolgeli-mimariler-nasil-kurulur-dns-geo%e2%80%91routing-ve-veritabani-replikasyonu-ile-korkusuz-felaket-dayanikliligi\/\">\u00e7ok b\u00f6lgeli mimarilerle felaket dayan\u0131kl\u0131l\u0131\u011f\u0131<\/a> ve <a href=\"https:\/\/www.dchost.com\/blog\/coklu-saglayici-dns-nasil-kurulur-octodns-ile-zero%e2%80%91downtime-gecis-ve-dayaniklilik-rehberi\/\">\u00e7oklu sa\u011flay\u0131c\u0131 DNS ile ge\u00e7i\u015f ve dayan\u0131kl\u0131l\u0131k<\/a>. Bu metinlerdeki d\u00fc\u015f\u00fcnme bi\u00e7imi, zamanlay\u0131c\u0131lar\u0131n\u0131z\u0131 tasarlarken de i\u015fliyor.<\/p>\n<h2 id=\"section-7\"><span id=\"cron_mu_systemd_Timer_mi_Ne_Zaman_Hangisi_Daha_Dogal_Hisseder\">cron mu systemd Timer m\u0131? Ne Zaman Hangisi Daha Do\u011fal Hisseder?<\/span><\/h2>\n<h3><span id=\"Sadelik_Ariyorsaniz\">Sadelik Ar\u0131yorsan\u0131z<\/span><\/h3>\n<p>Tek bir komutu, basit bir saat ifadesiyle ate\u015flemek istiyorsunuz ve makine hep a\u00e7\u0131k. Ortam de\u011fi\u015fkenlerini a\u00e7\u0131k a\u00e7\u0131k yazmay\u0131 dert etmiyorsunuz. Loglar\u0131 bir dosyaya ak\u0131t\u0131p ara s\u0131ra bakar\u0131m diyorsan\u0131z, cron burada h\u00e2l\u00e2 keyifli bir tercih. \u00dcstelik sistemi hi\u00e7 zorlamadan, hemen \u015fimdi kayda ge\u00e7ersiniz. Referans i\u00e7in crontab sayfas\u0131n\u0131 da el alt\u0131nda tutmak g\u00fczel: <a href=\"https:\/\/man7.org\/linux\/man-pages\/man5\/crontab.5.html\" rel=\"nofollow noopener\" target=\"_blank\">crontab(5) el kitab\u0131<\/a>.<\/p>\n<h3><span id=\"Guvenilirlik_Telafi_ve_Gozlem_Istiyorsaniz\">G\u00fcvenilirlik, Telafi ve G\u00f6zlem \u0130stiyorsan\u0131z<\/span><\/h3>\n<p>\u201cKa\u00e7an i\u015fi telafi etsin, loglar journald\u2019a d\u00fc\u015fs\u00fcn, ba\u011f\u0131ml\u0131l\u0131klar\u0131 tan\u0131mlayay\u0131m, kaynaklar\u0131 s\u0131n\u0131rlayay\u0131m, ba\u015far\u0131s\u0131zl\u0131kta nezaketle yeniden denesin\u201d diyorsan\u0131z, systemd timer do\u011fal bir ev. \u00d6zellikle gece g\u00f6revlerinde ve k\u00fcme senaryolar\u0131nda g\u00f6n\u00fcl rahatl\u0131\u011f\u0131 veriyor. Bir de <strong>RandomizedDelaySec<\/strong> gibi k\u00fc\u00e7\u00fck incelikler, b\u00fcy\u00fck kalabal\u0131klarda hayat kurtar\u0131yor.<\/p>\n<h3><span id=\"Ikisinin_Yan_Yana_Yasamasi\">\u0130kisinin Yan Yana Ya\u015famas\u0131<\/span><\/h3>\n<p>Bu bir \u201cya o, ya bu\u201d hik\u00e2yesi de\u011fil. Kimi sunucularda cron, kimilerinde timer; hatta ayn\u0131 makinede farkl\u0131 i\u015fler i\u00e7in ikisi birden. \u201cEldeki i\u015fi en iyi kim yapar?\u201d sorusuyla se\u00e7mek, uzun vadede daha sa\u011fl\u0131kl\u0131. Benim al\u0131\u015fkanl\u0131\u011f\u0131m, kritikli\u011fin artt\u0131\u011f\u0131 yerde timer\u2019a meyletmek, \u00e7ok basit ve h\u0131zl\u0131 i\u015flerde cron\u2019u korumak. Zamanla baz\u0131 cron g\u00f6revlerini timer\u2019a ta\u015f\u0131y\u0131p rahatlad\u0131\u011f\u0131m\u0131 itiraf edeyim.<\/p>\n<h2 id=\"section-8\"><span id=\"Uctan_Uca_Ornek_Yedekle_Kontrol_Et_Bildir\">U\u00e7tan Uca \u00d6rnek: Yedekle, Kontrol Et, Bildir<\/span><\/h2>\n<h3><span id=\"Dosya_Duzeni\">Dosya D\u00fczeni<\/span><\/h3>\n<p>\u015e\u00f6yle k\u00fc\u00e7\u00fck bir d\u00fczen d\u00fc\u015f\u00fcn\u00fcn: <strong>\/usr\/local\/bin\/backup.sh<\/strong> as\u0131l i\u015fi yap\u0131yor, kilit ve yeniden denemeyi i\u00e7inde hallediyor, ba\u015far\u0131\/ba\u015far\u0131s\u0131zl\u0131kta healthcheck\u2019e ping at\u0131yor. Ortam de\u011fi\u015fkenleri i\u00e7in <strong>\/etc\/backup.env<\/strong>, servis ve timer da a\u015fa\u011f\u0131daki gibi:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># \/etc\/backup.env\nBACKUP_SRC=\/var\/lib\/app\nBACKUP_DST=\/var\/backups\/app\nHC_OK=https:\/\/hc.example\/success-uuid\nHC_FAIL=https:\/\/hc.example\/fail-uuid\n<\/code><\/pre>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># \/usr\/local\/bin\/backup.sh\n#!\/usr\/bin\/env bash\nset -euo pipefail\n: &quot;${BACKUP_SRC:?}&quot;\n: &quot;${BACKUP_DST:?}&quot;\n: &quot;${HC_OK:?}&quot;\n: &quot;${HC_FAIL:?}&quot;\n\ntrap 'curl -fsS -m 10 &quot;$HC_FAIL&quot; &gt;\/dev\/null || true' ERR\n\nexec 9&gt; \/var\/run\/backup.lock\nflock -n 9 || { echo &quot;kilit alinamadi, zaten calisiyor&quot;; exit 0; }\n\nattempt=0\nmax=3\nwhile true; do\n  rsync -a --delete &quot;$BACKUP_SRC\/&quot; &quot;$BACKUP_DST\/&quot;\n  status=$?\n  if [[ $status -eq 0 ]]; then\n    break\n  fi\n  attempt=$((attempt+1))\n  [[ $attempt -ge $max ]] &amp;&amp; exit $status\n  sleep $((attempt * 10))\n  echo &quot;yeniden deneme: $attempt&quot;\ndone\n\ncurl -fsS -m 10 &quot;$HC_OK&quot; &gt;\/dev\/null || true\n<\/code><\/pre>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># \/etc\/systemd\/system\/backup.service\n[Unit]\nDescription=Uygulama Yedekleme\nWants=network-online.target\nAfter=network-online.target\n\n[Service]\nType=oneshot\nEnvironmentFile=\/etc\/backup.env\nExecStart=\/usr\/local\/bin\/backup.sh\nUser=backup\nGroup=backup\nWorkingDirectory=\/\nStandardOutput=journal\nStandardError=journal\nRestart=on-failure\nRestartSec=20s\n\n[Install]\nWantedBy=multi-user.target\n<\/code><\/pre>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># \/etc\/systemd\/system\/backup.timer\n[Unit]\nDescription=Uygulama Yedekleme - Gecelik\n\n[Timer]\nOnCalendar=03:15\nPersistent=true\nRandomizedDelaySec=90\nUnit=backup.service\n\n[Install]\nWantedBy=timers.target\n<\/code><\/pre>\n<p>Bu kurgu k\u00fc\u00e7\u00fck ama g\u00fc\u00e7l\u00fc. Ka\u00e7an i\u015fleri telafi eder, \u00e7ak\u0131\u015fmay\u0131 \u00f6nler, k\u0131sa kesintilerde yeniden dener, sonunda bir ping ile \u201cben iyiyim\u201d diye haber verir. Ayn\u0131 yakla\u015f\u0131m\u0131 sertifika yenileme, rapor \u00fcretme, indeksleme gibi i\u015flere de kolayca uyarlayabilirsiniz.<\/p>\n<h2 id=\"section-9\"><span id=\"Healthcheck_Izleme_Pano_Alarm_ve_Huzur\">Healthcheck \u0130zleme: Pano, Alarm ve Huzur<\/span><\/h2>\n<h3><span id=\"Kalp_Atisini_Gormek\">Kalp At\u0131\u015f\u0131n\u0131 G\u00f6rmek<\/span><\/h3>\n<p>Bir\u00e7ok ki\u015fi i\u00e7in zamanlanm\u0131\u015f i\u015fin en zor k\u0131sm\u0131, \u201cunutup gitti\u011fimde kim beni uyand\u0131racak?\u201d sorusu. D\u0131\u015f bir pano ve basit ping URL\u2019leri bu sorunu \u00e7ok pratik \u00e7\u00f6z\u00fcyor. Bir bak\u0131\u015fta, ye\u015fil mi k\u0131rm\u0131z\u0131 m\u0131 g\u00f6r\u00fcrs\u00fcn\u00fcz. S\u00fcre a\u015f\u0131m\u0131n\u0131, en uzun ko\u015fuyu, son hatay\u0131 tek bak\u0131\u015fta fark etmek kolayla\u015f\u0131r. Bu panoyu Slack veya e-posta ile ba\u011flamak da bir iki t\u0131k.<\/p>\n<h3><span id=\"Basarisizliktan_Ogrenme\">Ba\u015far\u0131s\u0131zl\u0131ktan \u00d6\u011frenme<\/span><\/h3>\n<p>Ping\u2019ler sadece alarm de\u011fildir; k\u00fc\u00e7\u00fck bir haf\u0131za da olu\u015fturur. \u201cSon \u00fc\u00e7 gece neden uzad\u0131?\u201d sorusuna, raporlara bak\u0131nca a\u011fdaki bir t\u0131kanma ya da disk yo\u011funlu\u011fu kendini ele verir. B\u00f6yle anlarda, timer\u2019\u0131n <strong>RandomizedDelaySec<\/strong> ayar\u0131yla oynamak, cron\u2019daysan\u0131z i\u015fin saatini hafif kayd\u0131rmak g\u00fczel sonu\u00e7 verir. K\u00fc\u00e7\u00fck dokunu\u015flarla gecenin ritmini d\u00fczeltirsiniz.<\/p>\n<h3><span id=\"Belgeleme_ve_Runbook\">Belgeleme ve Runbook<\/span><\/h3>\n<p>G\u00f6revin ba\u015f\u0131na k\u0131sa bir a\u00e7\u0131klama, beklenen s\u00fcresi ve \u201cpanik an\u0131nda ne yapaca\u011f\u0131z?\u201d notu koymay\u0131 seviyorum. K\u00fc\u00e7\u00fck bir runbook, gecenin bir yar\u0131s\u0131 gelen bildirimde saatler kazand\u0131r\u0131yor. \u0130lgili bir konuda, replikasyon ve felaket senaryolar\u0131nda bu zihniyeti nas\u0131l \u00e7er\u00e7eveledi\u011fimi \u015fu yaz\u0131da uzunca anlatt\u0131m: <a href=\"https:\/\/www.dchost.com\/blog\/s3-minioda-capraz-bolge-replikasyon-nasil-kurulur-versiyonlama-failover-ve-dr-runbookta-yol-haritasi\/\">S3\/MinIO \u00e7apraz b\u00f6lge replikasyon ve DR runbook<\/a>. Oradaki yakla\u015f\u0131m, burada da bire bir \u00e7al\u0131\u015f\u0131yor.<\/p>\n<h2 id=\"section-10\"><span id=\"Surprizler_Icin_Kucuk_Hileler\">S\u00fcrprizler \u0130\u00e7in K\u00fc\u00e7\u00fck Hileler<\/span><\/h2>\n<h3><span id=\"Calendar_Ifadeleri_ile_Incelik\">Calendar \u0130fadeleri ile \u0130ncelik<\/span><\/h3>\n<p>\u201cAy\u0131n son i\u015f g\u00fcn\u00fc \u00e7al\u0131\u015f, pazarlar\u0131 es ge\u00e7, her 15 dakikada ama 5 dakika kayd\u0131rarak ba\u015fla\u201d gibi ince ayarlar\u0131n\u0131z varsa, timer\u2019\u0131n takvimi c\u00f6mert. \u201cMon..Fri 23:00\u201d ya da \u201c*-*-01 04:00\u201d gibi kal\u0131plarla ak\u0131\u015f\u0131 kurcalayabilirsiniz. Detaylar i\u00e7in systemd sayfas\u0131nda g\u00fczel bir b\u00f6l\u00fcm var; \u201cOnCalendar\u201d adeta k\u00fc\u00e7\u00fck bir dil gibi: <a href=\"https:\/\/www.freedesktop.org\/software\/systemd\/man\/latest\/systemd.timer.html\" rel=\"nofollow noopener\" target=\"_blank\">systemd.timer OnCalendar<\/a>.<\/p>\n<h3><span id=\"Ad_Hoc_Calistirma\">Ad Hoc \u00c7al\u0131\u015ft\u0131rma<\/span><\/h3>\n<p>\u201c\u015eimdi, bir kere\u201d istiyorsunuz ama servis davran\u0131\u015flar\u0131 da ge\u00e7erli olsun. <strong>systemd-run<\/strong> burada y\u0131ld\u0131z gibi parl\u0131yor. \u00d6rne\u011fin:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">systemd-run --unit=ad-hoc-backup --on-active=5s \/usr\/local\/bin\/backup.sh\n<\/code><\/pre>\n<p>Be\u015f saniye sonra, ayn\u0131 g\u00fcnl\u00fck ve politika \u00e7er\u00e7evesinde ko\u015far. \u00dcstelik \u201cbu bir defal\u0131k\u201d oldu\u011fu i\u00e7in yap\u0131 da\u011f\u0131lm\u0131yor.<\/p>\n<h3><span id=\"cron_Kullanmaya_Devam_Edenlere_Minik_Hatirlatma\">cron Kullanmaya Devam Edenlere Minik Hat\u0131rlatma<\/span><\/h3>\n<p>cron\u2019dan kopmak istemiyorsan\u0131z, k\u00fc\u00e7\u00fck bir sa\u011fl\u0131k pingi ve flock ile \u00e7ok yol al\u0131rs\u0131n\u0131z. Ayr\u0131ca, sat\u0131r ba\u015f\u0131na PATH\u2019i a\u00e7\u0131k yazmak, <strong>set -euo pipefail<\/strong> ile script\u2019leri daha gergin \u00e7al\u0131\u015ft\u0131rmak ve loglar\u0131 zaman damgal\u0131 d\u00f6nd\u00fcrmek iyi pratikler. Kafan\u0131zda tak\u0131lan formatlar i\u00e7in \u015fu sayfay\u0131 s\u0131k ziyaret ederim: <a href=\"https:\/\/man7.org\/linux\/man-pages\/man5\/crontab.5.html\" rel=\"nofollow noopener\" target=\"_blank\">crontab(5) el kitab\u0131<\/a>.<\/p>\n<h2 id=\"section-11\"><span id=\"Kapanis_Guvenilirlik_Kucuk_Jestlerin_Toplamidir\">Kapan\u0131\u015f: G\u00fcvenilirlik, K\u00fc\u00e7\u00fck Jestlerin Toplam\u0131d\u0131r<\/span><\/h2>\n<p>Bir zamanlay\u0131c\u0131n\u0131n g\u00fcvenilirli\u011fi, tek bir \u00f6zelli\u011fin de\u011fil, k\u00fc\u00e7\u00fck jestlerin toplam\u0131. Biraz kilit, biraz yeniden deneme, ka\u00e7an i\u015fleri yakalama, loglar\u0131 net g\u00f6rmek, bir de g\u00f6r\u00fcnmeyen bir el gibi kalp at\u0131\u015f\u0131n\u0131 kontrol eden healthcheck. cron ile systemd timer aras\u0131nda dola\u015f\u0131rken, \u015funu unutmay\u0131n: En do\u011fru ara\u00e7, sizin <strong>rahat uyudu\u011funuz<\/strong> ara\u00e7t\u0131r. E\u011fer \u201cka\u00e7arsa telafi etsin, g\u00fcnl\u00fckler elimde olsun, ko\u015fullar\u0131m belli olsun\u201d diyorsan\u0131z, timer sizi sar\u0131p sarmalar. \u201cHemen yazay\u0131m, k\u00fc\u00e7\u00fck bir i\u015f, dosyaya loglar\u0131m yeter\u201d diyorsan\u0131z, cron h\u00e2l\u00e2 efsane.<\/p>\n<p>Pratik bir tavsiye ile bitireyim. Kritik i\u015flerde timer\u2019\u0131 deneyin, healthcheck pingi ekleyin ve k\u00fc\u00e7\u00fck bir runbook yaz\u0131n. Daha basit i\u015flerde cron\u2019a devam edin ama flock\u2019tan ve a\u00e7\u0131k PATH\u2019ten vazge\u00e7meyin. Bir de, da\u011f\u0131t\u0131m ve sa\u011fl\u0131k takibi gibi konularla ilgileniyorsan\u0131z, bu yaz\u0131ya e\u015flik edecek bir okuma olarak <a href=\"https:\/\/www.dchost.com\/blog\/vpste-canary-dagitimi-nasil-tatli-tatli-kurulur-nginx-agirlikli-yonlendirme-saglik-kontrolu-ve-guvenli-rollback\/\">canary da\u011f\u0131t\u0131m\u0131yla sa\u011fl\u0131\u011f\u0131 kollamak<\/a> ve <a href=\"https:\/\/www.dchost.com\/blog\/3-vps-ile-k3s-yuksek-erisilebilirlik-kumesi-traefik-cert%e2%80%91manager-ve-longhorn-ile-uretime-hazir-kurulum\/\">k\u00fcmelerde \u00fcretim\u2011haz\u0131r kurulum<\/a> iyi gider. Umar\u0131m bu yaz\u0131 size faydal\u0131 olmu\u015ftur. Bir dahaki yaz\u0131da g\u00f6r\u00fc\u015fmek \u00fczere; o zamana kadar, zamanlay\u0131c\u0131lar\u0131n\u0131z nazik olsun, i\u015fleriniz de sessizce, g\u00fcvenle aks\u0131n.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u0130&ccedil;indekiler1 Ofiste Bir Sabah: Bir Cron Kayd\u0131, Bir Sessizlik ve Bir Fark Edi\u015f2 Zamanlanm\u0131\u015f \u0130\u015fler Neden K\u0131r\u0131l\u0131r? K\u00fc\u00e7\u00fck Ta\u015flar, B\u00fcy\u00fck Dalgalar2.1 G\u00f6r\u00fcnmez Varsay\u0131mlar2.2 \u00c7ak\u0131\u015fan \u00c7al\u0131\u015fmalar2.3 Ka\u00e7an Aral\u0131klar3 Cron\u2019un Sade D\u00fcnyas\u0131: Basit, H\u0131zl\u0131, Ama Birka\u00e7 Tuzakla3.1 Bir Klasik: crontab4 systemd Timer\u2019lar\u0131n D\u00fcnyas\u0131: Bir T\u0131k Daha \u015eefkatli Otomasyon4.1 Timer + Service: \u0130kili Yap\u01314.2 Ortam ve G\u00fcnl\u00fckler4.3 Ko\u015fullar [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1990,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-1989","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-teknoloji"],"_links":{"self":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1989","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/comments?post=1989"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1989\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/1990"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=1989"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=1989"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=1989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}