Linux İşletim Sistemi

Linux işletim Sisteminde Nohup Kullanımı ve Nohup Komutları Nohup Nedir ?

Nohup yani “no hangup”, anlamına gelen, linux işletim sisteminde, program sonlanmasını önleyen yazılım diye kısa bir açıklama yapabiliriz. Bunu anlamanın kolay yolu güzel bir örnekten geçiyor yine. 

Linux tabanlı bir sunucunuz var, sunucu içerisinde bir işlem yapıyorsunuz kapanmasını istemiyorsunuz. Bunu sağlamanın evet bir çok yolu var, mesela crone ile bu servisi ayakta tutabilirim veya benzeri olan screen adında  başka programda var,  ama bence en kolayı ve stabili nohup ‘tur. :)

Nohup ve Screen arasındaki ufak fark

* Nohup işlemi arka planda tutar, bu yüzden oturumu kapatsanız bile çalışmaya devam eder.

* Screen işlemi bir alt işlem olarak ortaya çıkar, böylece ekrandan ayırabilirsiniz. Ekran çalıştığı sürece işlem çalışmaya devam eder.

 

Kod örnekleri ile Nohup

Çalışma prensibi, normal programı çalıştırdığınız komutun başına nohup yazmaktır. Program aktif duruma geldiğinde, bir günlük tutar “nohup.out”. bu günlüğü cat ile okuyabilirsiniz. 

$ nohup komut_adi 
$ cat nohup.out

Çıktıyı output.txt dosyasına yönlendirmek için komutu aşağıdaki şekilde çalıştırabilirsiniz. output.txt dosyasının çıktısını cat ile okuyabilirsiniz.

$ nohup bash sleep2.sh> output.txt
$ cat çıktı.txt

Nohup komutunu '&' ile kullanma

Yukarıdaki örneklerde, ssh ile bağlantı kurdunuz ve üstte yer alan örnekler ile bir işlem yaptığınızda, program çalışacak hatta terminal içerisinde başka başka işlemlerde yapabilecek duruma gelirsiniz. Ancak terminal veya ssh i kapattığınızda process sonlanacak ve program kapanacaktır.

ampersant&” işareti aslında nohup komutu değildir. Nohup ile kullanıldığında ise güzel şeyler olur. :) Program artık elle  process sonlandırılan kadar devam eder.

nohup sh de.sh &

Ekran Çıktısı :

[email protected]:/var/Videos# nohup sh de.sh &
[1] 17749
[email protected]:/var/Videos# nohup: ignoring input and appending output to 'nohup.out'
[1]+  Done                    nohupsh de.sh &

Şeklinde kullanılır ve program çalıştığında size programın pidProcess id“ sini verir. Yukarıdaki diğer komutlar gibi günlük tutma işlemini yapar.

[1] 17749” Örnekteki 17749 bu işlemin pid numarasıdır. Bu işlemi artık durdurmak istiyorsanız;

 

kill -9 17749

Komutunu kullanmanız yeterlidir.

 

Çalışan Prosssesleri görmek için Ps Aux komutunu Grep komutu ile daraltarak bulabiliriz. Altta yer alan örnekte .sh uzantılı sunucuda çalışan tüm prosesleri gösterecektir.

ps aux|grep .sh 

 

Örnek çıktı :

[email protected]:/var/Videos# ps aux|grep .sh 
root       621  0.0  0.6  72296  6232 ?        Ss   Dec15   0:00 /usr/sbin/sshd -D
root       639  0.0  1.6 189592 16976 ?        Ssl  Dec15   0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
root     16479  0.0  0.7 112152  7096 ?        Ss   06:58   0:00 sshd: [email protected]/2
root     16561  0.0  0.5  23212  5416 pts/2    Ss+  06:58   0:00 -bash
root     16671  0.0  0.7 112152  7196 ?        Ss   07:02   0:00 sshd: [email protected]
root     16753  0.0  0.2  13060  2216 ?        Ss   07:02   0:00 /usr/lib/openssh/sftp-server
root     16938  0.0  0.7 112152  7200 ?        Ss   07:11   0:00 sshd: [email protected]/3
root     17020  0.0  0.5  23152  5328 pts/3    Ss+  07:11   0:00 -bash
root     17173  0.0  0.7 112152  7172 ?        Ss   07:26   0:00 sshd: [email protected]
root     17255  0.0  0.2  13060  2184 ?        Ss   07:26   0:00 /usr/lib/openssh/sftp-server
root     17440  0.0  0.7 112152  7368 ?        Ss   08:56   0:00 sshd: root
root     17546  0.0  0.7 112152  7224 ?        Ss   08:57   0:00 sshd: [email protected]/4
root     17628  0.0  0.4  22904  4756 pts/4    Ss+  08:57   0:00 -bash
root     17651  0.0  0.7 112152  7320 ?        Ss   09:03   0:00 sshd: [email protected]/0
root     17733  0.0  0.5  23216  5380 pts/0    Ss   09:03   0:00 -bash
root     17760  0.0  0.5  72296  5740 ?        Ss   09:06   0:00 sshd: [accepted]
sshd     17761  0.0  0.2  72296  2956 ?        S    09:06   0:00 sshd: [net]
root     17764  0.0  0.5  72296  5672 ?        Ss   09:07   0:00 sshd: [accepted]
root     17767  0.0  0.1  14728  1044 pts/0    S+   09:08   0:00 grep --color=auto .sh

 

"root     17767 0.0  0.1 14728 1044 pts/0    S+ 09:08 0:00 grep --color=auto .sh" bu cıktıyı ele alırsak 17767 pid numarasıdır.

 

Ben Nerelerde Kullanıyorum ?

Evet arkadaşlar sunucu da, birden çok yazdığım python ile servisler var. Bu servislerin kapanmaması ve olası hatalarda devam etmesi için veya terminalde uzun sürecek bir işlemin (Mysql Yedek gibi), sonucu beklemeden, terminalde başka işlemler yapmak için Nohup kullanıyorum.

 

Özelini sona sakladım :) Benim kullandığım ve kendime göre şekillendirdğim kod bloğu, hem çıktı hemde pid numarasını saklamak için iyi bir yol;

nohup sh de.sh > de_cikti.out 2>&1 echo $! > de_pid.pid