4 saniye boyunca bir işlem başlatan Bash betiği, sonra çalışmıyor


2

Firefox'u 4 saniye boyunca başlatan bir betiğim var, sonra onu öldürüyor. Firefox otomatik olarak sabit bir portala giriş yapacaktır, bu yüzden wifi bağlanır bağlamaz sadece 4 saniye açık olmam gerekiyor. 13.04 Ubuntu'dayım.

Benim sorunum $ pid ayarlanmamış gibi görünüyor.

firefox ; pid=$!
sleep 4
kill $pid

EDIT: kaldırıldı seti ve şimdi geçersiz bir pid öldürmek veriyor.


2
NB $! arka planda çalışan son işin PID'si (işlem kimliği) olduğundan ;, &en azından bununla değiştirmeniz gerekir . Bunun senin asıl problemini çözeceği anlamına gelmez.
Cristian Ciupitu

Bunun soruyu cevaplamadığını biliyorum, ancak neden esir portal üzerinden giriş yapmak için firefox kullanmalı? Bu bir savaş gemisiyle kürek çekmek gibidir. Wget veya kıvrılma çok daha hafif. ( Kıvrılma örneğine bağlantı ).
Hennes


@Hennes Ayrıca bir esir portalına giriş yapmak istedim. Wget ve curl benim için başarısız oldu (belki javascript öğeleri veya benzeri şeyler yüzünden). Sonunda elinks kullanarak başardı . Kıvrılma veya kıvrılma kadar hafif değil, ancak firefox'tan çok daha iyi.
Tim

@Tim Buradaki sorun, çalışabilmesi için çalışması gereken süslü bir javascript olması.
Yine Başka Bir Kullanıcı

Yanıtlar:


9

Komut dosyanız çalışmıyor, çünkü firefox işlemi sona erinceye ve ardındanpid=$! diğer komutları çalıştırana kadar bekler .

İstediğini yapmanın kolay bir yolu timeout:

timeout 4s firefox

İlk argümandan sonra sağlanan programı başlatır ve ilk argüman geçtikten sonra verilen süreden sonra durdurur.


Nedir timeout? Standart Linux kurulumlarının bir parçası olduğunu sanmıyorum.
jaychris

1
@ jaychris İle birlikte geliyor coreutils, bu yüzden standart bir kurulumun parçası olmalı.
Tim

Ubuntu sunucumda eksik görünüyor. (En son Ubuntu değil, fakat apt-get bunu kolayca düzeltebilir).
Hennes

Öylesine harika, Jenkins'te betik yazıyor ve zaman aşımı dışında, sadece Zed'in çıkması için kontrol edilebilecek bir şov günlükleri komutu vardı!
edencorbin

1

Senin neden pid=$!başarısız olduğunu $!ise çalıştırmak son iş PID arka .

yani,

$ foo & echo $!

fooişleminin PID'sini başlatacak ve ekleyecektir .

Senin durumunda, onunla firefox ; pid=$!değiştirilmesi gerekecekti, firefox & pid=$!ama asıl ikili firefoxolan bir betik olduğundan oldukça yararsız olabilir exec.

Yapmanız gereken şey, ya kullanmak killall( tüm firefox örneklerini öldürmeye çalışacak , sizinkinin ya da diğer kullanıcılarınkileri öldürmek için çalışacak ) ya da (yeni kopyayı kopyalamak için) /usr/bin/firefoxyeni PID'yi ekleyerek komut dosyasını düzenlemektir .


why downvote? ..
sds

0

Birkaç çözüm daha.


Firefox'u öldürmek güvenli modda çalıştırır. Bu istenmeyen bir şey.
Yine Başka Bir Kullanıcı

-1

Diğer cevaplardan birkaç ipucu aldıktan sonra, bu karışık senaryo ile karşılaştım:

firefox -no-remote -p c-portal &
ffpid=`ps aux | grep firefox | sed '2q;d' | tr -s ' ' | cut -d ' ' -f 2`
echo "firefox pid: $ffpid"
sleep 4
kill $ffpid

Ayrıca, about: config ve browser.sessionstore.resume_from_crashfalse olarak değiştirmem gerekiyordu.

Her komutun açıklaması: ps aux sistemdeki işlemlerin tam listesini alır, grep, firefox içerenleri bulur, sed ikinci satırı alır (her zaman firefox'un son örneği gibi görünür), tr fazladan boşlukları kaldırır, kes ikinci sütunu alır (-d, boşluk olan sınırlayıcı anlamına gelir).

Dize işleme karmaşasından sonra, firefox'un PID'sini basan, 4 saniye boyunca uykuya devam eden bir hata ayıklama işlemi var, böylece oturum açabiliyor, ardından firefox'u öldürüyor. About: config ayarı oturumu geri yüklemeye çalışmasını engeller.


1
Bir işlem kimliği almak için kullanışlı bir komuttur pgrep.
Dean

Dean'in önerdiği gibi, pgrep firefoxtüm "string-process karmaşasını" kullanmaktan kaçınır. Ve gerçekten, bunun için firefox kullanmak aptalca, yavaş ve kaynak yoğundur. Sadece kullanın curlveya wgetHennes'in önerdiği gibi.
terdon

@ terdon HAVE denedim. Aptalca tutulan portalları, POST'un taleplerini tersine mühendislik uygulayamadığım bir javascript kullanıyor. Wireshark kullanarak baktım ve yapması gereken şeyi yapma girişimim korkunç başarısızlıkla sonuçlandı. Bir şey yapmadan önce tarayıcının sabit portal sayfasını ziyaret edip etmediğini kontrol ediyor olabilir.
Yine Başka Bir Kullanıcı

Yeterince adil, firefox kullanmak, diğer kişilerin kodlarını deşifre etmekten çok daha kolaydır.
terdon

@terdon Özellikle başkalarına okunabilir olmasını pek önemsemediklerinde. Dahası, insanların bunu okumasını istemiyorlarsa, güvenliklerini bozabileceklerinden.
Yine Başka Bir Kullanıcı

-2

Durumunuza uygun olup olmadığından emin değilim, ama killallbunun yerine kullanabilirsiniz kill. Yani olacaktı:

firefox
sleep 4
killall firefox

Daha doğru bir yaklaşım kullanarak son firefox sürecini kullanmak olduğunu düşünüyorum ps aux | grep firefox, ancak bugün bash betiğini kullanarak yalnızca bu en yüksek işlem sayısını döndürme işlemini nasıl yapacağımı bilmiyorum.


Kesinlikle hayır! Genellikle, çalışan bir sürü firefox örneğim var ve hepsini öldürmek istemiyorum. ps aux | grep firefoxYine de ilginç görünüyor. Deneyeceğim.
Yine Bir Başka Kullanıcı

@YetAnotherUser: bir sürü örneğiniz yok (işlemler), birden fazla pencere ve sekme görüntüleyen sadece bir işleminiz var. Mümkünse, bunun için ayrı bir profil kullanmanızı öneririm.
Cristian Ciupitu

Ayrı profil? Hımm evet. Pid'i alan uzun bir komut dizisini birlikte hackledim. Tamamen çalışmasını sağlar almaz kısa sürede göndereceğim.
Yine Başka Bir Kullanıcı

Killall tehlikesinin yanı sıra (Linux'taki tüm &firefox'ları öldürün, daha çok Solaris'i öldürün), firefox komutundan sonra eklemek isteyebilirsiniz . Aksi halde, ateşinizi kapatıncaya kadar uykunuz başlamaz.
Hennes
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.