Bir bash betiği arka planda çalışıp çalışmadığını nasıl saptayabilir?


Yanıtlar:


30

Alıntı yapmak man ps:

PROSES DEVLET KODLARI

   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

Şüphesiz $ (...) içinde çağrılan herhangi bir şey arka planda çalışıyor ....? Sanırım süreç grubu önemli bir şey, işe yaradığını inkar edemem.
Ed Randall

2

/Etc/bash.bashrc "dosyasına bakın.

"$ PS1" olan satır. Sonra bir "adam bash" yapın ve token PS1'i arayın.

[ -z "$PS1" ] && return

etkileşimli olmayan bir komut dosyasından çıkar.


1

Önceki tüm çözümler yumurtlama işlemlerini vb. İçerir. Çok, çok çirkin, çünkü .bashrcbir 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

NEDEN BAĞIRIYORSUN? Bu çok, çok çirkin görünüyor ...
Pierre.Vriens,

Basit, doğru çözüm.
Ed Randall

0

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 -largü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ü stdoutbir 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 pgrpve tpgid( bkz / proc / [pid] / istatistik adam sayfasının bölümü - man 5 proc).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.