Bir bash betiğinin ön planda mı yoksa arka planda mı çalıştığını bilmesinin bir yolu var mı ve böylece her durumda biraz farklı davranabilir mi?
Bir bash betiğinin ön planda mı yoksa arka planda mı çalıştığını bilmesinin bir yolu var mı ve böylece her durumda biraz farklı davranabilir mi?
Yanıtlar:
Alıntı yapmak man ps
:
Here are the different values that the s, stat and state output
specifiers (header "STAT" or "S") will display to describe the state of
a process.
...
+ is in the foreground process group
Böylece basit bir kontrol yapabilirsiniz:
case $(ps -o stat= -p $$) in
*+*) echo "Running in foreground" ;;
*) echo "Running in background" ;;
esac
Önceki tüm çözümler yumurtlama işlemlerini vb. İçerir. Çok, çok çirkin, çünkü .bashrc
bir bash kabuğu her açıldığında denir, bu nedenle bu çözümler 1000'lerin işlemlerini başlatır.
Çok daha temizleyici bash soruyor: bash $-
etkileşimli bir kabukta çalışıyorsa "i" olan önceden tanımlanmış bir değişkene sahip. Örneğin, bunu .bashrc içine koymak çok daha temiz ve çok daha ucuz ve en önemlisi her zaman işe yarayacak!
case "$-" in
*i*) # interactive shell
;;
esac
Kabuğun etkileşimli modda çalıştırılıp çalıştırılmadığını kontrol etmenin aynı sonucu vereceğini düşünebilseniz de pratikte bu değildir. Kavramı benzer görünüyor ama aslında farklı. Arka planda etkileşimli bir komut dosyası çalıştırabilirsinizBeklediğiniz besleme girişinde . Ayrıca, senaryonuzu bash ile -l
argümanla başlatabilirsiniz . Bu nedenle, senaryomuzun arka planda mı yoksa ön planda mı çalıştığını kontrol etmek için bash etkileşimine güvenemeyiz.
Bu nedenle devnull'un cevabı doğrudur . İşlemin ön planda çalışıp çalışmadığını belirlemek için ps yardımcı programı , işlem grubunun (pgrp) oturumun kontrol terminaliyle (tpgid) ilişkili işlem grubu kimliği ile aynı olup olmadığını kontrol eder ve işleme+
göre işleme bir işaret ekler belirtmek, bildirmek.
Bunu bilerek, kesinlikle testin saf bir bash versiyonuna sahip olabiliriz:
#!/usr/bin/env bash
IFS=$' '
retval=($(</proc/$$/stat))
IFS=$' \t\n'
if [[ "${retval[3]}" == "${retval[7]}" ]]; then
echo "Background" > ./result.txt
else
echo "Foreground" > ./result.txt
fi
exit
Yukarıdaki kodda, sonucu bir metin dosyasında çıkarıyoruz çünkü stdout
bir işlem arka planda çalıştırıldığında bağlı değildir.
4th dikkat ve tablonun 8 elemanları sırasıyla karşılık Lütfen pgrp
ve tpgid
( bkz / proc / [pid] / istatistik adam sayfasının bölümü - man 5 proc
).