[{"data":1,"prerenderedAt":1638},["ShallowReactive",2],{"page-tr-\u002Fblog\u002Fsystemd-service-guide":3,"related-tr-\u002Fblog\u002Fsystemd-service-guide":1615},{"id":4,"title":5,"body":6,"date":1602,"description":1603,"extension":1604,"meta":1605,"navigation":274,"path":1606,"seo":1607,"stem":1608,"tags":1609,"translation":1613,"__hash__":1614},"pages_tr\u002Ftr\u002Fblog\u002Fsystemd-service-guide.md","systemd ile Linux Servisi Yazmak",{"type":7,"value":8,"toc":1589},"minimark",[9,14,23,35,39,209,213,220,386,444,447,512,522,532,536,657,760,766,770,777,807,826,829,902,906,962,965,993,1004,1008,1011,1188,1203,1207,1210,1267,1280,1284,1287,1345,1413,1465,1471,1475,1566,1570,1585],[10,11,13],"h2",{"id":12},"giriş","Giriş",[15,16,17,18,22],"p",{},"Bir Java jar'ını, Node.js uygulamasını ya da bir Python script'ini sunucuda ",[19,20,21],"code",{},"nohup ... &"," ile başlatmak ilk bakışta işe yarar; ama süreç çöktüğünde kimse yeniden başlatmaz, sunucu reboot olduğunda uygulama açılmaz ve loglar dağınık kalır.",[15,24,25,26,30,31,34],{},"Modern Linux dağıtımlarının (Ubuntu, Debian, AlmaLinux, RHEL) tamamında bulunan ",[27,28,29],"strong",{},"systemd",", bu işleri ek bir araç kurmadan çözer: süreci başlatır, çökerse yeniden başlatır, açılışta otomatik çalıştırır ve loglarını ",[19,32,33],{},"journald","'a toplar.",[10,36,38],{"id":37},"_1-temel-systemctl-komutları","1. Temel systemctl komutları",[40,41,46],"pre",{"className":42,"code":43,"language":44,"meta":45,"style":45},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo systemctl start myapp       # başlat\nsudo systemctl stop myapp        # durdur\nsudo systemctl restart myapp     # yeniden başlat\nsudo systemctl reload myapp      # yapılandırmayı yeniden oku (destekliyorsa)\nsudo systemctl enable myapp      # açılışta otomatik başlat\nsudo systemctl enable --now myapp    # enable + start\nsudo systemctl disable myapp\nsystemctl status myapp           # durum, PID, son log satırları\nsystemctl is-active myapp\nsystemctl list-units --type=service --state=running\nsystemctl list-units --failed\n","bash","",[19,47,48,71,86,101,116,131,148,161,175,185,199],{"__ignoreMap":45},[49,50,53,57,61,64,67],"span",{"class":51,"line":52},"line",1,[49,54,56],{"class":55},"sBMFI","sudo",[49,58,60],{"class":59},"sfazB"," systemctl",[49,62,63],{"class":59}," start",[49,65,66],{"class":59}," myapp",[49,68,70],{"class":69},"sHwdD","       # başlat\n",[49,72,74,76,78,81,83],{"class":51,"line":73},2,[49,75,56],{"class":55},[49,77,60],{"class":59},[49,79,80],{"class":59}," stop",[49,82,66],{"class":59},[49,84,85],{"class":69},"        # durdur\n",[49,87,89,91,93,96,98],{"class":51,"line":88},3,[49,90,56],{"class":55},[49,92,60],{"class":59},[49,94,95],{"class":59}," restart",[49,97,66],{"class":59},[49,99,100],{"class":69},"     # yeniden başlat\n",[49,102,104,106,108,111,113],{"class":51,"line":103},4,[49,105,56],{"class":55},[49,107,60],{"class":59},[49,109,110],{"class":59}," reload",[49,112,66],{"class":59},[49,114,115],{"class":69},"      # yapılandırmayı yeniden oku (destekliyorsa)\n",[49,117,119,121,123,126,128],{"class":51,"line":118},5,[49,120,56],{"class":55},[49,122,60],{"class":59},[49,124,125],{"class":59}," enable",[49,127,66],{"class":59},[49,129,130],{"class":69},"      # açılışta otomatik başlat\n",[49,132,134,136,138,140,143,145],{"class":51,"line":133},6,[49,135,56],{"class":55},[49,137,60],{"class":59},[49,139,125],{"class":59},[49,141,142],{"class":59}," --now",[49,144,66],{"class":59},[49,146,147],{"class":69},"    # enable + start\n",[49,149,151,153,155,158],{"class":51,"line":150},7,[49,152,56],{"class":55},[49,154,60],{"class":59},[49,156,157],{"class":59}," disable",[49,159,160],{"class":59}," myapp\n",[49,162,164,167,170,172],{"class":51,"line":163},8,[49,165,166],{"class":55},"systemctl",[49,168,169],{"class":59}," status",[49,171,66],{"class":59},[49,173,174],{"class":69},"           # durum, PID, son log satırları\n",[49,176,178,180,183],{"class":51,"line":177},9,[49,179,166],{"class":55},[49,181,182],{"class":59}," is-active",[49,184,160],{"class":59},[49,186,188,190,193,196],{"class":51,"line":187},10,[49,189,166],{"class":55},[49,191,192],{"class":59}," list-units",[49,194,195],{"class":59}," --type=service",[49,197,198],{"class":59}," --state=running\n",[49,200,202,204,206],{"class":51,"line":201},11,[49,203,166],{"class":55},[49,205,192],{"class":59},[49,207,208],{"class":59}," --failed\n",[10,210,212],{"id":211},"_2-i̇lk-unit-dosyası","2. İlk unit dosyası",[15,214,215,216,219],{},"Kendi servisleriniz için unit dosyaları ",[19,217,218],{},"\u002Fetc\u002Fsystemd\u002Fsystem\u002F"," altına konur. Örnek olarak bir Spring Boot uygulaması:",[40,221,225],{"className":222,"code":223,"language":224,"meta":45,"style":45},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fmyapp.service\n[Unit]\nDescription=My Spring Boot App\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nUser=myapp\nGroup=myapp\nWorkingDirectory=\u002Fopt\u002Fmyapp\nExecStart=\u002Fusr\u002Fbin\u002Fjava -Xmx512m -jar \u002Fopt\u002Fmyapp\u002Fapp.jar\nRestart=on-failure\nRestartSec=5\nSuccessExitStatus=143\n\n[Install]\nWantedBy=multi-user.target\n","ini",[19,226,227,232,238,251,261,270,276,281,291,301,310,320,331,342,353,364,369,375],{"__ignoreMap":45},[49,228,229],{"class":51,"line":52},[49,230,231],{"class":69},"# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fmyapp.service\n",[49,233,234],{"class":51,"line":73},[49,235,237],{"class":236},"sMK4o","[Unit]\n",[49,239,240,244,247],{"class":51,"line":88},[49,241,243],{"class":242},"swJcz","Description",[49,245,246],{"class":236},"=",[49,248,250],{"class":249},"sTEyZ","My Spring Boot App\n",[49,252,253,256,258],{"class":51,"line":103},[49,254,255],{"class":242},"After",[49,257,246],{"class":236},[49,259,260],{"class":249},"network-online.target\n",[49,262,263,266,268],{"class":51,"line":118},[49,264,265],{"class":242},"Wants",[49,267,246],{"class":236},[49,269,260],{"class":249},[49,271,272],{"class":51,"line":133},[49,273,275],{"emptyLinePlaceholder":274},true,"\n",[49,277,278],{"class":51,"line":150},[49,279,280],{"class":236},"[Service]\n",[49,282,283,286,288],{"class":51,"line":163},[49,284,285],{"class":242},"Type",[49,287,246],{"class":236},[49,289,290],{"class":249},"simple\n",[49,292,293,296,298],{"class":51,"line":177},[49,294,295],{"class":242},"User",[49,297,246],{"class":236},[49,299,300],{"class":249},"myapp\n",[49,302,303,306,308],{"class":51,"line":187},[49,304,305],{"class":242},"Group",[49,307,246],{"class":236},[49,309,300],{"class":249},[49,311,312,315,317],{"class":51,"line":201},[49,313,314],{"class":242},"WorkingDirectory",[49,316,246],{"class":236},[49,318,319],{"class":249},"\u002Fopt\u002Fmyapp\n",[49,321,323,326,328],{"class":51,"line":322},12,[49,324,325],{"class":242},"ExecStart",[49,327,246],{"class":236},[49,329,330],{"class":249},"\u002Fusr\u002Fbin\u002Fjava -Xmx512m -jar \u002Fopt\u002Fmyapp\u002Fapp.jar\n",[49,332,334,337,339],{"class":51,"line":333},13,[49,335,336],{"class":242},"Restart",[49,338,246],{"class":236},[49,340,341],{"class":249},"on-failure\n",[49,343,345,348,350],{"class":51,"line":344},14,[49,346,347],{"class":242},"RestartSec",[49,349,246],{"class":236},[49,351,352],{"class":249},"5\n",[49,354,356,359,361],{"class":51,"line":355},15,[49,357,358],{"class":242},"SuccessExitStatus",[49,360,246],{"class":236},[49,362,363],{"class":249},"143\n",[49,365,367],{"class":51,"line":366},16,[49,368,275],{"emptyLinePlaceholder":274},[49,370,372],{"class":51,"line":371},17,[49,373,374],{"class":236},"[Install]\n",[49,376,378,381,383],{"class":51,"line":377},18,[49,379,380],{"class":242},"WantedBy",[49,382,246],{"class":236},[49,384,385],{"class":249},"multi-user.target\n",[40,387,389],{"className":42,"code":388,"language":44,"meta":45,"style":45},"sudo useradd --system --no-create-home --shell \u002Fusr\u002Fsbin\u002Fnologin myapp\nsudo systemctl daemon-reload     # yeni\u002Fdeğişen unit dosyasını oku\nsudo systemctl enable --now myapp\nsystemctl status myapp\n",[19,390,391,412,424,436],{"__ignoreMap":45},[49,392,393,395,398,401,404,407,410],{"class":51,"line":52},[49,394,56],{"class":55},[49,396,397],{"class":59}," useradd",[49,399,400],{"class":59}," --system",[49,402,403],{"class":59}," --no-create-home",[49,405,406],{"class":59}," --shell",[49,408,409],{"class":59}," \u002Fusr\u002Fsbin\u002Fnologin",[49,411,160],{"class":59},[49,413,414,416,418,421],{"class":51,"line":73},[49,415,56],{"class":55},[49,417,60],{"class":59},[49,419,420],{"class":59}," daemon-reload",[49,422,423],{"class":69},"     # yeni\u002Fdeğişen unit dosyasını oku\n",[49,425,426,428,430,432,434],{"class":51,"line":88},[49,427,56],{"class":55},[49,429,60],{"class":59},[49,431,125],{"class":59},[49,433,142],{"class":59},[49,435,160],{"class":59},[49,437,438,440,442],{"class":51,"line":103},[49,439,166],{"class":55},[49,441,169],{"class":59},[49,443,160],{"class":59},[15,445,446],{},"Bölümlerin anlamı:",[448,449,450,463],"table",{},[451,452,453],"thead",{},[454,455,456,460],"tr",{},[457,458,459],"th",{},"Bölüm",[457,461,462],{},"Görevi",[464,465,466,486,496],"tbody",{},[454,467,468,474],{},[469,470,471],"td",{},[19,472,473],{},"[Unit]",[469,475,476,477,479,480,479,482,485],{},"Açıklama ve diğer unit'lerle ilişki (",[19,478,255],{},", ",[19,481,265],{},[19,483,484],{},"Requires",")",[454,487,488,493],{},[469,489,490],{},[19,491,492],{},"[Service]",[469,494,495],{},"Sürecin nasıl çalışacağı: komut, kullanıcı, restart politikası",[454,497,498,503],{},[469,499,500],{},[19,501,502],{},"[Install]",[469,504,505,508,509],{},[19,506,507],{},"enable"," edildiğinde hangi hedefe bağlanacağı; sunucular için ",[19,510,511],{},"multi-user.target",[15,513,514,517,518,521],{},[19,515,516],{},"SuccessExitStatus=143",", Java'nın ",[19,519,520],{},"SIGTERM"," ile kapanırken döndürdüğü 143 kodunun hata sayılmamasını sağlar.",[523,524,525],"blockquote",{},[15,526,527,528,531],{},"Unit dosyasını her değiştirdiğinizde ",[19,529,530],{},"systemctl daemon-reload"," çalıştırmayı unutmayın; aksi halde systemd eski hali kullanmaya devam eder.",[10,533,535],{"id":534},"_3-nodejs-ve-python-örnekleri","3. Node.js ve Python örnekleri",[40,537,539],{"className":222,"code":538,"language":224,"meta":45,"style":45},"# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fapi.service\n[Unit]\nDescription=Node.js API\nAfter=network.target\n\n[Service]\nUser=deploy\nWorkingDirectory=\u002Fvar\u002Fwww\u002Fapi\nExecStart=\u002Fusr\u002Fbin\u002Fnode server.js\nRestart=always\nEnvironment=NODE_ENV=production\nEnvironment=PORT=3000\n\n[Install]\nWantedBy=multi-user.target\n",[19,540,541,546,550,559,568,572,576,585,594,603,612,627,641,645,649],{"__ignoreMap":45},[49,542,543],{"class":51,"line":52},[49,544,545],{"class":69},"# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fapi.service\n",[49,547,548],{"class":51,"line":73},[49,549,237],{"class":236},[49,551,552,554,556],{"class":51,"line":88},[49,553,243],{"class":242},[49,555,246],{"class":236},[49,557,558],{"class":249},"Node.js API\n",[49,560,561,563,565],{"class":51,"line":103},[49,562,255],{"class":242},[49,564,246],{"class":236},[49,566,567],{"class":249},"network.target\n",[49,569,570],{"class":51,"line":118},[49,571,275],{"emptyLinePlaceholder":274},[49,573,574],{"class":51,"line":133},[49,575,280],{"class":236},[49,577,578,580,582],{"class":51,"line":150},[49,579,295],{"class":242},[49,581,246],{"class":236},[49,583,584],{"class":249},"deploy\n",[49,586,587,589,591],{"class":51,"line":163},[49,588,314],{"class":242},[49,590,246],{"class":236},[49,592,593],{"class":249},"\u002Fvar\u002Fwww\u002Fapi\n",[49,595,596,598,600],{"class":51,"line":177},[49,597,325],{"class":242},[49,599,246],{"class":236},[49,601,602],{"class":249},"\u002Fusr\u002Fbin\u002Fnode server.js\n",[49,604,605,607,609],{"class":51,"line":187},[49,606,336],{"class":242},[49,608,246],{"class":236},[49,610,611],{"class":249},"always\n",[49,613,614,617,619,622,624],{"class":51,"line":201},[49,615,616],{"class":242},"Environment",[49,618,246],{"class":236},[49,620,621],{"class":242},"NODE_ENV",[49,623,246],{"class":236},[49,625,626],{"class":249},"production\n",[49,628,629,631,633,636,638],{"class":51,"line":322},[49,630,616],{"class":242},[49,632,246],{"class":236},[49,634,635],{"class":242},"PORT",[49,637,246],{"class":236},[49,639,640],{"class":249},"3000\n",[49,642,643],{"class":51,"line":333},[49,644,275],{"emptyLinePlaceholder":274},[49,646,647],{"class":51,"line":344},[49,648,374],{"class":236},[49,650,651,653,655],{"class":51,"line":355},[49,652,380],{"class":242},[49,654,246],{"class":236},[49,656,385],{"class":249},[40,658,660],{"className":222,"code":659,"language":224,"meta":45,"style":45},"# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fworker.service\n[Unit]\nDescription=Python worker\nAfter=network.target\n\n[Service]\nUser=deploy\nWorkingDirectory=\u002Fopt\u002Fworker\nExecStart=\u002Fopt\u002Fworker\u002F.venv\u002Fbin\u002Fpython worker.py\nRestart=on-failure\nEnvironment=PYTHONUNBUFFERED=1\n\n[Install]\nWantedBy=multi-user.target\n",[19,661,662,667,671,680,688,692,696,704,713,722,730,744,748,752],{"__ignoreMap":45},[49,663,664],{"class":51,"line":52},[49,665,666],{"class":69},"# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fworker.service\n",[49,668,669],{"class":51,"line":73},[49,670,237],{"class":236},[49,672,673,675,677],{"class":51,"line":88},[49,674,243],{"class":242},[49,676,246],{"class":236},[49,678,679],{"class":249},"Python worker\n",[49,681,682,684,686],{"class":51,"line":103},[49,683,255],{"class":242},[49,685,246],{"class":236},[49,687,567],{"class":249},[49,689,690],{"class":51,"line":118},[49,691,275],{"emptyLinePlaceholder":274},[49,693,694],{"class":51,"line":133},[49,695,280],{"class":236},[49,697,698,700,702],{"class":51,"line":150},[49,699,295],{"class":242},[49,701,246],{"class":236},[49,703,584],{"class":249},[49,705,706,708,710],{"class":51,"line":163},[49,707,314],{"class":242},[49,709,246],{"class":236},[49,711,712],{"class":249},"\u002Fopt\u002Fworker\n",[49,714,715,717,719],{"class":51,"line":177},[49,716,325],{"class":242},[49,718,246],{"class":236},[49,720,721],{"class":249},"\u002Fopt\u002Fworker\u002F.venv\u002Fbin\u002Fpython worker.py\n",[49,723,724,726,728],{"class":51,"line":187},[49,725,336],{"class":242},[49,727,246],{"class":236},[49,729,341],{"class":249},[49,731,732,734,736,739,741],{"class":51,"line":201},[49,733,616],{"class":242},[49,735,246],{"class":236},[49,737,738],{"class":242},"PYTHONUNBUFFERED",[49,740,246],{"class":236},[49,742,743],{"class":249},"1\n",[49,745,746],{"class":51,"line":322},[49,747,275],{"emptyLinePlaceholder":274},[49,749,750],{"class":51,"line":333},[49,751,374],{"class":236},[49,753,754,756,758],{"class":51,"line":344},[49,755,380],{"class":242},[49,757,246],{"class":236},[49,759,385],{"class":249},[15,761,762,765],{},[19,763,764],{},"PYTHONUNBUFFERED=1"," olmadan Python çıktıyı tamponlar ve loglar journal'a gecikmeli düşer.",[10,767,769],{"id":768},"_4-ortam-değişkenleri-ve-gizli-değerler","4. Ortam değişkenleri ve gizli değerler",[15,771,772,773,776],{},"Az sayıda değişken için ",[19,774,775],{},"Environment="," yeterlidir. Çok sayıda değişken ya da şifre içeren değerler için ayrı bir dosya kullanın:",[40,778,780],{"className":42,"code":779,"language":44,"meta":45,"style":45},"# \u002Fetc\u002Fmyapp\u002Fmyapp.env  (chmod 600, sahibi root)\nSPRING_PROFILES_ACTIVE=prod\nDB_PASSWORD=s3cret\n",[19,781,782,787,797],{"__ignoreMap":45},[49,783,784],{"class":51,"line":52},[49,785,786],{"class":69},"# \u002Fetc\u002Fmyapp\u002Fmyapp.env  (chmod 600, sahibi root)\n",[49,788,789,792,794],{"class":51,"line":73},[49,790,791],{"class":249},"SPRING_PROFILES_ACTIVE",[49,793,246],{"class":236},[49,795,796],{"class":59},"prod\n",[49,798,799,802,804],{"class":51,"line":88},[49,800,801],{"class":249},"DB_PASSWORD",[49,803,246],{"class":236},[49,805,806],{"class":59},"s3cret\n",[40,808,810],{"className":222,"code":809,"language":224,"meta":45,"style":45},"[Service]\nEnvironmentFile=\u002Fetc\u002Fmyapp\u002Fmyapp.env\n",[19,811,812,816],{"__ignoreMap":45},[49,813,814],{"class":51,"line":52},[49,815,280],{"class":236},[49,817,818,821,823],{"class":51,"line":73},[49,819,820],{"class":242},"EnvironmentFile",[49,822,246],{"class":236},[49,824,825],{"class":249},"\u002Fetc\u002Fmyapp\u002Fmyapp.env\n",[15,827,828],{},"Değişkenlerin servise ulaştığını kontrol etmek için:",[40,830,832],{"className":42,"code":831,"language":44,"meta":45,"style":45},"systemctl show myapp --property=Environment\nsudo cat \u002Fproc\u002F$(systemctl show -p MainPID --value myapp)\u002Fenviron | tr '\\0' '\\n'\n",[19,833,834,846],{"__ignoreMap":45},[49,835,836,838,841,843],{"class":51,"line":52},[49,837,166],{"class":55},[49,839,840],{"class":59}," show",[49,842,66],{"class":59},[49,844,845],{"class":59}," --property=Environment\n",[49,847,848,850,853,856,859,861,863,866,869,872,874,876,879,882,885,888,891,894,896,899],{"class":51,"line":73},[49,849,56],{"class":55},[49,851,852],{"class":59}," cat",[49,854,855],{"class":59}," \u002Fproc\u002F",[49,857,858],{"class":236},"$(",[49,860,166],{"class":55},[49,862,840],{"class":59},[49,864,865],{"class":59}," -p",[49,867,868],{"class":59}," MainPID",[49,870,871],{"class":59}," --value",[49,873,66],{"class":59},[49,875,485],{"class":236},[49,877,878],{"class":59},"\u002Fenviron",[49,880,881],{"class":236}," |",[49,883,884],{"class":55}," tr",[49,886,887],{"class":236}," '",[49,889,890],{"class":59},"\\0",[49,892,893],{"class":236},"'",[49,895,887],{"class":236},[49,897,898],{"class":59},"\\n",[49,900,901],{"class":236},"'\n",[10,903,905],{"id":904},"_5-restart-politikaları","5. Restart politikaları",[448,907,908,920],{},[451,909,910],{},[454,911,912,917],{},[457,913,914],{},[19,915,916],{},"Restart=",[457,918,919],{},"Ne zaman yeniden başlatır",[464,921,922,932,942,952],{},[454,923,924,929],{},[469,925,926],{},[19,927,928],{},"no",[469,930,931],{},"Hiçbir zaman (varsayılan)",[454,933,934,939],{},[469,935,936],{},[19,937,938],{},"on-failure",[469,940,941],{},"Sıfır dışı çıkış kodu, sinyal, timeout",[454,943,944,949],{},[469,945,946],{},[19,947,948],{},"on-abnormal",[469,950,951],{},"Sinyal ya da timeout (çıkış kodu hariç)",[454,953,954,959],{},[469,955,956],{},[19,957,958],{},"always",[469,960,961],{},"Her çıkışta, temiz çıkış dahil",[15,963,964],{},"Sürekli çöken bir servisin sonsuz döngüye girmesini sınırlamak için:",[40,966,968],{"className":222,"code":967,"language":224,"meta":45,"style":45},"[Unit]\nStartLimitIntervalSec=60\nStartLimitBurst=5\n",[19,969,970,974,984],{"__ignoreMap":45},[49,971,972],{"class":51,"line":52},[49,973,237],{"class":236},[49,975,976,979,981],{"class":51,"line":73},[49,977,978],{"class":242},"StartLimitIntervalSec",[49,980,246],{"class":236},[49,982,983],{"class":249},"60\n",[49,985,986,989,991],{"class":51,"line":88},[49,987,988],{"class":242},"StartLimitBurst",[49,990,246],{"class":236},[49,992,352],{"class":249},[15,994,995,996,999,1000,1003],{},"60 saniye içinde 5'ten fazla başlatma denemesi olursa systemd servisi ",[19,997,998],{},"failed"," durumuna alır ve denemeyi bırakır. Sayaç ",[19,1001,1002],{},"systemctl reset-failed myapp"," ile sıfırlanır.",[10,1005,1007],{"id":1006},"_6-journalctl-ile-loglar","6. journalctl ile loglar",[15,1009,1010],{},"Servisin stdout\u002Fstderr çıktısı otomatik olarak journal'a yazılır:",[40,1012,1014],{"className":42,"code":1013,"language":44,"meta":45,"style":45},"journalctl -u myapp                  # tüm loglar\njournalctl -u myapp -f               # canlı takip\njournalctl -u myapp -n 200           # son 200 satır\njournalctl -u myapp --since \"1 hour ago\"\njournalctl -u myapp --since today\njournalctl -u myapp --since \"2026-10-30 09:00\" --until \"2026-10-30 10:00\"\njournalctl -u myapp -p err           # sadece error ve üstü\njournalctl -u myapp -b               # son açılıştan beri\njournalctl -u myapp -o cat           # zaman damgası olmadan sade çıktı\njournalctl --disk-usage\nsudo journalctl --vacuum-time=14d    # 14 günden eski logları sil\n",[19,1015,1016,1029,1043,1061,1081,1094,1122,1138,1152,1168,1175],{"__ignoreMap":45},[49,1017,1018,1021,1024,1026],{"class":51,"line":52},[49,1019,1020],{"class":55},"journalctl",[49,1022,1023],{"class":59}," -u",[49,1025,66],{"class":59},[49,1027,1028],{"class":69},"                  # tüm loglar\n",[49,1030,1031,1033,1035,1037,1040],{"class":51,"line":73},[49,1032,1020],{"class":55},[49,1034,1023],{"class":59},[49,1036,66],{"class":59},[49,1038,1039],{"class":59}," -f",[49,1041,1042],{"class":69},"               # canlı takip\n",[49,1044,1045,1047,1049,1051,1054,1058],{"class":51,"line":88},[49,1046,1020],{"class":55},[49,1048,1023],{"class":59},[49,1050,66],{"class":59},[49,1052,1053],{"class":59}," -n",[49,1055,1057],{"class":1056},"sbssI"," 200",[49,1059,1060],{"class":69},"           # son 200 satır\n",[49,1062,1063,1065,1067,1069,1072,1075,1078],{"class":51,"line":103},[49,1064,1020],{"class":55},[49,1066,1023],{"class":59},[49,1068,66],{"class":59},[49,1070,1071],{"class":59}," --since",[49,1073,1074],{"class":236}," \"",[49,1076,1077],{"class":59},"1 hour ago",[49,1079,1080],{"class":236},"\"\n",[49,1082,1083,1085,1087,1089,1091],{"class":51,"line":118},[49,1084,1020],{"class":55},[49,1086,1023],{"class":59},[49,1088,66],{"class":59},[49,1090,1071],{"class":59},[49,1092,1093],{"class":59}," today\n",[49,1095,1096,1098,1100,1102,1104,1106,1109,1112,1115,1117,1120],{"class":51,"line":133},[49,1097,1020],{"class":55},[49,1099,1023],{"class":59},[49,1101,66],{"class":59},[49,1103,1071],{"class":59},[49,1105,1074],{"class":236},[49,1107,1108],{"class":59},"2026-10-30 09:00",[49,1110,1111],{"class":236},"\"",[49,1113,1114],{"class":59}," --until",[49,1116,1074],{"class":236},[49,1118,1119],{"class":59},"2026-10-30 10:00",[49,1121,1080],{"class":236},[49,1123,1124,1126,1128,1130,1132,1135],{"class":51,"line":150},[49,1125,1020],{"class":55},[49,1127,1023],{"class":59},[49,1129,66],{"class":59},[49,1131,865],{"class":59},[49,1133,1134],{"class":59}," err",[49,1136,1137],{"class":69},"           # sadece error ve üstü\n",[49,1139,1140,1142,1144,1146,1149],{"class":51,"line":163},[49,1141,1020],{"class":55},[49,1143,1023],{"class":59},[49,1145,66],{"class":59},[49,1147,1148],{"class":59}," -b",[49,1150,1151],{"class":69},"               # son açılıştan beri\n",[49,1153,1154,1156,1158,1160,1163,1165],{"class":51,"line":177},[49,1155,1020],{"class":55},[49,1157,1023],{"class":59},[49,1159,66],{"class":59},[49,1161,1162],{"class":59}," -o",[49,1164,852],{"class":59},[49,1166,1167],{"class":69},"           # zaman damgası olmadan sade çıktı\n",[49,1169,1170,1172],{"class":51,"line":187},[49,1171,1020],{"class":55},[49,1173,1174],{"class":59}," --disk-usage\n",[49,1176,1177,1179,1182,1185],{"class":51,"line":201},[49,1178,56],{"class":55},[49,1180,1181],{"class":59}," journalctl",[49,1183,1184],{"class":59}," --vacuum-time=14d",[49,1186,1187],{"class":69},"    # 14 günden eski logları sil\n",[15,1189,1190,1191,1194,1195,1198,1199,1202],{},"Journal'ın disk kullanımını kalıcı olarak sınırlamak için ",[19,1192,1193],{},"\u002Fetc\u002Fsystemd\u002Fjournald.conf"," içinde ",[19,1196,1197],{},"SystemMaxUse=500M"," ayarlayıp ",[19,1200,1201],{},"sudo systemctl restart systemd-journald"," çalıştırın.",[10,1204,1206],{"id":1205},"_7-basit-güvenlik-sıkılaştırması","7. Basit güvenlik sıkılaştırması",[15,1208,1209],{},"systemd, süreci birkaç satırla kısıtlamanıza izin verir:",[40,1211,1213],{"className":222,"code":1212,"language":224,"meta":45,"style":45},"[Service]\nNoNewPrivileges=true\nPrivateTmp=true\nProtectSystem=strict\nProtectHome=true\nReadWritePaths=\u002Fopt\u002Fmyapp\u002Fdata \u002Fvar\u002Flog\u002Fmyapp\n",[19,1214,1215,1219,1229,1238,1248,1257],{"__ignoreMap":45},[49,1216,1217],{"class":51,"line":52},[49,1218,280],{"class":236},[49,1220,1221,1224,1226],{"class":51,"line":73},[49,1222,1223],{"class":242},"NoNewPrivileges",[49,1225,246],{"class":236},[49,1227,1228],{"class":249},"true\n",[49,1230,1231,1234,1236],{"class":51,"line":88},[49,1232,1233],{"class":242},"PrivateTmp",[49,1235,246],{"class":236},[49,1237,1228],{"class":249},[49,1239,1240,1243,1245],{"class":51,"line":103},[49,1241,1242],{"class":242},"ProtectSystem",[49,1244,246],{"class":236},[49,1246,1247],{"class":249},"strict\n",[49,1249,1250,1253,1255],{"class":51,"line":118},[49,1251,1252],{"class":242},"ProtectHome",[49,1254,246],{"class":236},[49,1256,1228],{"class":249},[49,1258,1259,1262,1264],{"class":51,"line":133},[49,1260,1261],{"class":242},"ReadWritePaths",[49,1263,246],{"class":236},[49,1265,1266],{"class":249},"\u002Fopt\u002Fmyapp\u002Fdata \u002Fvar\u002Flog\u002Fmyapp\n",[15,1268,1269,1272,1273,1275,1276,1279],{},[19,1270,1271],{},"ProtectSystem=strict"," tüm dosya sistemini salt okunur yapar; uygulamanın yazması gereken klasörleri ",[19,1274,1261],{}," ile açarsınız. Servisin ne kadar korunaklı olduğunu görmek için ",[19,1277,1278],{},"systemd-analyze security myapp"," kullanabilirsiniz.",[10,1281,1283],{"id":1282},"_8-timer-ile-zamanlanmış-görev","8. Timer ile zamanlanmış görev",[15,1285,1286],{},"systemd timer'ları cron'a alternatiftir; loglar journal'da toplanır ve kaçırılan çalıştırmalar telafi edilebilir. Her gece 02:00'de çalışan bir yedekleme:",[40,1288,1290],{"className":222,"code":1289,"language":224,"meta":45,"style":45},"# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup.service\n[Unit]\nDescription=Nightly database backup\n\n[Service]\nType=oneshot\nUser=postgres\nExecStart=\u002Fusr\u002Flocal\u002Fbin\u002Fbackup.sh\n",[19,1291,1292,1297,1301,1310,1314,1318,1327,1336],{"__ignoreMap":45},[49,1293,1294],{"class":51,"line":52},[49,1295,1296],{"class":69},"# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup.service\n",[49,1298,1299],{"class":51,"line":73},[49,1300,237],{"class":236},[49,1302,1303,1305,1307],{"class":51,"line":88},[49,1304,243],{"class":242},[49,1306,246],{"class":236},[49,1308,1309],{"class":249},"Nightly database backup\n",[49,1311,1312],{"class":51,"line":103},[49,1313,275],{"emptyLinePlaceholder":274},[49,1315,1316],{"class":51,"line":118},[49,1317,280],{"class":236},[49,1319,1320,1322,1324],{"class":51,"line":133},[49,1321,285],{"class":242},[49,1323,246],{"class":236},[49,1325,1326],{"class":249},"oneshot\n",[49,1328,1329,1331,1333],{"class":51,"line":150},[49,1330,295],{"class":242},[49,1332,246],{"class":236},[49,1334,1335],{"class":249},"postgres\n",[49,1337,1338,1340,1342],{"class":51,"line":163},[49,1339,325],{"class":242},[49,1341,246],{"class":236},[49,1343,1344],{"class":249},"\u002Fusr\u002Flocal\u002Fbin\u002Fbackup.sh\n",[40,1346,1348],{"className":222,"code":1347,"language":224,"meta":45,"style":45},"# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup.timer\n[Unit]\nDescription=Run backup nightly\n\n[Timer]\nOnCalendar=*-*-* 02:00:00\nPersistent=true\n\n[Install]\nWantedBy=timers.target\n",[19,1349,1350,1355,1359,1368,1372,1377,1387,1396,1400,1404],{"__ignoreMap":45},[49,1351,1352],{"class":51,"line":52},[49,1353,1354],{"class":69},"# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup.timer\n",[49,1356,1357],{"class":51,"line":73},[49,1358,237],{"class":236},[49,1360,1361,1363,1365],{"class":51,"line":88},[49,1362,243],{"class":242},[49,1364,246],{"class":236},[49,1366,1367],{"class":249},"Run backup nightly\n",[49,1369,1370],{"class":51,"line":103},[49,1371,275],{"emptyLinePlaceholder":274},[49,1373,1374],{"class":51,"line":118},[49,1375,1376],{"class":236},"[Timer]\n",[49,1378,1379,1382,1384],{"class":51,"line":133},[49,1380,1381],{"class":242},"OnCalendar",[49,1383,246],{"class":236},[49,1385,1386],{"class":249},"*-*-* 02:00:00\n",[49,1388,1389,1392,1394],{"class":51,"line":150},[49,1390,1391],{"class":242},"Persistent",[49,1393,246],{"class":236},[49,1395,1228],{"class":249},[49,1397,1398],{"class":51,"line":163},[49,1399,275],{"emptyLinePlaceholder":274},[49,1401,1402],{"class":51,"line":177},[49,1403,374],{"class":236},[49,1405,1406,1408,1410],{"class":51,"line":187},[49,1407,380],{"class":242},[49,1409,246],{"class":236},[49,1411,1412],{"class":249},"timers.target\n",[40,1414,1416],{"className":42,"code":1415,"language":44,"meta":45,"style":45},"sudo systemctl daemon-reload\nsudo systemctl enable --now backup.timer\nsystemctl list-timers\nsystemd-analyze calendar \"*-*-* 02:00:00\"   # ifadenin bir sonraki çalışma zamanı\n",[19,1417,1418,1427,1440,1447],{"__ignoreMap":45},[49,1419,1420,1422,1424],{"class":51,"line":52},[49,1421,56],{"class":55},[49,1423,60],{"class":59},[49,1425,1426],{"class":59}," daemon-reload\n",[49,1428,1429,1431,1433,1435,1437],{"class":51,"line":73},[49,1430,56],{"class":55},[49,1432,60],{"class":59},[49,1434,125],{"class":59},[49,1436,142],{"class":59},[49,1438,1439],{"class":59}," backup.timer\n",[49,1441,1442,1444],{"class":51,"line":88},[49,1443,166],{"class":55},[49,1445,1446],{"class":59}," list-timers\n",[49,1448,1449,1452,1455,1457,1460,1462],{"class":51,"line":103},[49,1450,1451],{"class":55},"systemd-analyze",[49,1453,1454],{"class":59}," calendar",[49,1456,1074],{"class":236},[49,1458,1459],{"class":59},"*-*-* 02:00:00",[49,1461,1111],{"class":236},[49,1463,1464],{"class":69},"   # ifadenin bir sonraki çalışma zamanı\n",[15,1466,1467,1470],{},[19,1468,1469],{},"Persistent=true",", sunucu 02:00'de kapalıysa açıldığında görevin hemen çalışmasını sağlar.",[10,1472,1474],{"id":1473},"_9-sorun-giderme","9. Sorun giderme",[448,1476,1477,1487],{},[451,1478,1479],{},[454,1480,1481,1484],{},[457,1482,1483],{},"Durum",[457,1485,1486],{},"Bakılacak yer",[464,1488,1489,1501,1514,1524,1541,1556],{},[454,1490,1491,1496],{},[469,1492,1493],{},[19,1494,1495],{},"status=203\u002FEXEC",[469,1497,1498,1500],{},[19,1499,325],{}," yolu yanlış ya da dosya çalıştırılabilir değil; mutlak yol kullanın",[454,1502,1503,1508],{},[469,1504,1505],{},[19,1506,1507],{},"status=217\u002FUSER",[469,1509,1510,1513],{},[19,1511,1512],{},"User="," ile belirtilen kullanıcı yok",[454,1515,1516,1519],{},[469,1517,1518],{},"Değişiklik etkisiz",[469,1520,1521,1523],{},[19,1522,530],{}," unutuldu",[454,1525,1526,1529],{},[469,1527,1528],{},"Komut terminalde çalışıyor, serviste çalışmıyor",[469,1530,1531,1534,1535,1537,1538,1540],{},[19,1532,1533],{},"PATH"," ve ortam değişkenleri farklı; ",[19,1536,314],{}," ve ",[19,1539,616],{}," tanımlayın",[454,1542,1543,1546],{},[469,1544,1545],{},"Servis sürekli yeniden başlıyor",[469,1547,1548,1551,1552,1555],{},[19,1549,1550],{},"journalctl -u myapp -n 100"," ile hatayı okuyun; ",[19,1553,1554],{},"systemctl reset-failed"," ile sayacı sıfırlayın",[454,1557,1558,1561],{},[469,1559,1560],{},"Unit dosyası hatalı mı?",[469,1562,1563],{},[19,1564,1565],{},"systemd-analyze verify \u002Fetc\u002Fsystemd\u002Fsystem\u002Fmyapp.service",[10,1567,1569],{"id":1568},"sonuç","Sonuç",[15,1571,1572,1573,1576,1577,1580,1581,1584],{},"systemd ile bir servis yazmak, 10-15 satırlık bir unit dosyası demek. Karşılığında otomatik yeniden başlatma, açılışta çalışma, merkezi loglar ve süreç izolasyonu ek hiçbir araç kurmadan gelir. Akılda tutulacak üç komut: değişiklikten sonra ",[19,1574,1575],{},"daemon-reload",", durum için ",[19,1578,1579],{},"systemctl status",", sebep için ",[19,1582,1583],{},"journalctl -u",".",[1586,1587,1588],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":45,"searchDepth":73,"depth":73,"links":1590},[1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601],{"id":12,"depth":73,"text":13},{"id":37,"depth":73,"text":38},{"id":211,"depth":73,"text":212},{"id":534,"depth":73,"text":535},{"id":768,"depth":73,"text":769},{"id":904,"depth":73,"text":905},{"id":1006,"depth":73,"text":1007},{"id":1205,"depth":73,"text":1206},{"id":1282,"depth":73,"text":1283},{"id":1473,"depth":73,"text":1474},{"id":1568,"depth":73,"text":1569},"2026-10-30","Bir uygulamayı systemd servisi olarak çalıştırmak — unit dosyası, restart politikası, ortam değişkenleri, journalctl ile log okuma ve timer ile zamanlanmış görevler.","md",{},"\u002Ftr\u002Fblog\u002Fsystemd-service-guide",{"title":5,"description":1603},"tr\u002Fblog\u002Fsystemd-service-guide",[1610,29,1611,1612],"linux","devops","rehber","\u002Fen\u002Fblog\u002Fsystemd-service-guide","GGsaeu1DmF4gGE7HfHiib_gP_FAe7AkznjZmlm3I4XU",[1616,1624,1631],{"path":1617,"title":1618,"description":1619,"date":1620,"tags":1621},"\u002Ftr\u002Fblog\u002Fgithub-actions-ci-cd","GitHub Actions ile CI\u002FCD — Build, Test ve Sunucuya Deploy","Bir projeyi her push'ta build edip test eden, main'e merge edilince SSH ile kendi sunucunuza deploy eden GitHub Actions workflow'u adım adım.","2026-10-29",[1622,1623,1611,1612],"github","ci-cd",{"path":1625,"title":1626,"description":1627,"date":1628,"tags":1629},"\u002Ftr\u002Fblog\u002Fnginx-reverse-proxy-ssl","Nginx Reverse Proxy ve Let's Encrypt SSL Kurulumu","Bir Node.js ya da Spring Boot uygulamasını Nginx arkasına almak, Certbot ile ücretsiz SSL sertifikası almak ve otomatik yenilemeyi kurmak.","2026-10-28",[1630,1610,1611,1612],"nginx",{"path":1632,"title":1633,"description":1634,"date":1635,"tags":1636},"\u002Ftr\u002Fblog\u002Fdocker-compose-guide","Docker Compose ile Çoklu Servis Çalıştırma","Uygulama, veritabanı ve cache'i tek bir compose.yaml ile ayağa kaldırmak — servisler, network, volume, healthcheck, env dosyaları ve sık kullanılan komutlar.","2026-10-27",[1637,1611,1612],"docker",1793321446013]