21 Eylül 2015 Pazartesi

nohup

Giriş
Linux ve Unix'te terminalden çalıştırılan programlar, terminal kapatılınca işletim sistemi tarafından öldürülürler. İş "&" karakteri ile arka plana atılsa bile bu durum değişmez. Kullanıcı terminali kapatsa veya logoff olsa bile bazı işlerin çalışmasını isteyebilir. Bu durumda Linux ve Unix'te nohup kullanılır.

Windows'ta nohup'a direkt karşılık gelen bir şey yok. Kullanıcı terminali kapatırsa uygulamanın çalışmaya devam etmesi start komutu ile sağlanabiliyor ancak logoff olması durumunda uygulamanın çalışmaya devam edebilmesinin tek yolu uygulamayı Scheduled Task veya Servis olarak çalıştırmak.

nohup ve diğer seçenekler
Yazıya başlamadan önce şunu belirtmekte fayda var, nohup tek seçenek değil. Aynı işlevi yerine getirebilen screen, tmux, byobu gibi başka uygulamalar da var.

Zaten Çalışmakta Olan Uygulamalar İçin
disown yapılabilir. Önce Ctrl+Z ile uygulama duraklatılır. bg ile arka plana gönderilir. disown ile mevcut kabuk ile bağlantısı koparılır. Sonra kabuktan çıkılır.

nohup nedir
Açıklaması şöyle
NAME
       nohup - run a command immune to hangups, with output to a non-tty

SYNOPSIS
       nohup COMMAND [ARG]...
       nohup OPTION
Linux ve Unix'te nohup nasıl kullanılır?
nohup komutunu şöyle kullanılır.
nohup COMMAND [ARGS] &
nohup arkaplanda çalıştırılır. Böylece shell'de çalışmaya devam edebiliriz. Nohup uygulamamızın çıktısını nohup.out dosyasına yönlendirir. Bazen bu dosya çok büyük boyutlara ulaşabildiği için dikkatli olmak gerekir.

stdout akımını yönlendirmek
Eğer istersek çıktıyı dev/null'a yönlendirebiliriz.
nohup COMMAND > /dev/null &
stdout, stderror ve stdin akımlarını yönlendirmek
Eğer nohup ile çalıştırılan komut stdin, stdout, stderr gibi akımlara ihtiyaç duyuyorsa, shell'den çıkınca bu akımlar da kapatılacağı için uygulamamız donabilir. Bu durumda nohup şöyle kullanılır.
nohup myprogram > foo.out 2> foo.err < /dev/null &

stdout ve sterr akımlarını yönlendirmeyi anlamak kolay. Peki niçin stdin'i de dev/null'a yönlendiriyoruz. Uygulamamız terminalden bir şey okuyorsa artık terminali olmayacağı için donar. < dev/null ile uygulama terminalden okumaya çalışır ve EOF okur.

nohup altta ne yapar?
Normalde parent uygulama kapatılırsa veya ölürse, başlattığı child uygulamalar etkilenmezler! Ancak bir terminal kapatılırsa, terminali kontrol eden uygulama yani shell SIGHUP sinyali alır. Shell kendi session'ı içindeki her uygulamaya da SIGHUP (Hang up) sinyali gönderir. Böylece uygulamalar da ölürler.

nohup HUP sinyalini dikkate almaz. Böylece kendi başlattığı komut ta HUP sinyalinden etkilenmez.

nohup ve execvp ilişkisi
Aslında kod çok basit.
Önce nohup sinyali kaale almamasını sağlayan sistem çağrısını yapar.
signal(SIGHUP, SIG_IGN);
Daha sonra execvp çağrısı ile verilen komutu çalıştırır.
execvp(*argv, argc);

Windows'ta Start
Başka bir programı çalıştırmaya yarar.
start java -jar spider.jar
Eğer istenirse yeni pencere küçültülmüş olarak başlatılabilir. Örnek:
start /min java -jar spider.jar
Normalde program bitince pencere de kapanır. cmd /k ile yeni komut satırı açık kalır.
start cmd /k java -jar spider.jar



Hiç yorum yok:

Yorum Gönder