Bozuk Boru hatasını nasıl düzeltebilirim?


36

Geçenlerde (adresindeki talimatları uygulayarak RVM yeniden http://rvm.io Bir SSD Drive aldığımda Ubuntu 12.10 kurulumu taze sonra).

Şimdi, yazdığımda: type rvm | head -1

Aşağıdaki hatayı alıyorum:

rvm is a function
-bash: type: write error: Broken pipe

Ama hemen komutu tekrar edersem sadece şunu alırım:

rvm is a function

Ve her şey yolunda görünüyor? Ne oluyor? Düzeltmek için ne yapabilirim? Her zaman olmaz. Daha sporadik görünüyor. Bir çeşit örüntü bulmaya çalıştım ama henüz bulamadım.

Yanıtlar:


57

Bu durumda "Kırık boru" görünmesi nadirdir, ancak normaldir.

Çalıştırdığınızda type rvm | head -1, bash type rvmbir işlemde diğeri içinde yürütülür head -1. 1 stdout borununtype "yazma" ucuna , "okuma" ucuna std bağlı . Her iki işlem de aynı anda çalışır.head

head -1İşlem Stdin'den (genellikle 8 kB parçalar halinde) verileri, (göre tek bir hat üzerinden baskı okur -1borusunun "okuma" ucu kapatılabilir neden seçeneği) ve çıkışları. Yana rvmfonksiyonu, bu araçlar (ayrıştırılır ve Bash tarafından yeniden inşa ediliyor sonra 11 kB civarında) oldukça uzun headçıkışlar ise typehala birkaç veri kB vardır dışarı yazmak için.

Bu noktada, typediğer ucu kapalı olan bir boruya yazmaya çalıştığından - kırık bir boru - yaktığı yazma () işlevi "Kırık boru" olarak çevrilen bir EPIPE hatası döndürecektir. Bu hataya ek olarak, çekirdek type, varsayılan olarak işlemi hemen öldüren SIGPIPE sinyalini de gönderir .

(Sinyal, etkileşimli mermilerde çok kullanışlıdır, çünkü çoğu kullanıcı ilk işlemin çalışmaya devam etmesini ve hiçbir yere yazmaya çalışmasını istemez. Böylesine basit bir hatada ölürler - böylece hata kodunu çok faydalı bulurlar.)

Bununla birlikte, sinyal iletimi hemen% 100 değildir ve write () 'nin EPIPE'yi döndürdüğü ve işlemin sinyali almadan önce kısa bir süre boyunca çalışmaya devam ettiği durumlar olabilir. Bu durumda, typebaşarısız yazmayı fark etmek, hata kodunu çevirmek ve hatta SIGPIPE tarafından öldürülmeden önce stderr'e bir hata mesajı basmak için yeterli zaman alır. (Hata mesajında ​​"-bash: type:" yazıyor type, çünkü bash komutunun kendisinde yerleşik bir komut var.)

Bu, çok işlemcili sistemlerde daha yaygın görünüyor, çünkü typeişlem ve çekirdeğin sinyal teslim kodu aynı anda farklı çekirdeklerde çalışabiliyor.

Bu mesajı, typeyerleşik (bash kaynak kodunda) write () işlevinden bir EPIPE aldığında hemen çıkmak için yamayı ekleyerek kaldırmak mümkün olacaktır .

Ancak, endişelenecek bir şey yok ve rvmherhangi bir şekilde kurulumunuzla ilgili değil .


Teşekkür ederim! Endişelendim. Rvm kurulumumu gidermek ve tamir etmeye çalışmak için onarımlar yaparken dün gece Google Googling’e değecek bir saatte sorun giderdim. Ben sadece bir SSD sürücüsü ile değiştirdim ve LVM kullandım ve sabit sürücüyü şifreledim, böylece devreye giren birçok değişken vardı ve neyin yana gittiğinden emin değildim. Aklımı rahatlattığın için teşekkür ederim!
Jason Shultz

Ben çıktısının edilmiştir lsthrough head -1yıldır ve bugün de bir kırık boru mesajı alıyorum.
Tulains Córdova

1
(Not: "Kırık boru" hatası sinyalden gelmez. Errno'dan gelir . Kabuk, sinyal kaynaklı çıkışlar için metin mesajları gösterse de, genellikle bir SIGPIPE çıkışının bir sinyal vermiş gibi davranması yeterince akıllıdır. 'temiz' bir.)
yerçekimi

23

Borunuza takılarak , kesilmiş bir boruyu başka bir işlem pahasına sabitleyebilirsiniz tail -n +1:

rvm yazın | kuyruk -n +1 | kafa -1

+1Söyler tailgiriş ve sonraki her şey ilk satırını yazdırmak için. Çıktı, tail -n +1orada olmadığı gibi tamamen aynı olacaktır , ancak program standart çıkışı kontrol etmek için yeterince akıllı ve boruyu temiz bir şekilde kapatıyor. Artık kırık boru yok .


1
İyi numara. Burada sağlanandan farklı bir durumda kullandım. Teşekkürler!
Biri hala MS-DOS'u

6
Harika bir çözüm gibiydi, ancak Ubuntu 14.04.2'de kuyruk 8.21 ile "kuyruk: yazma hatası: Kırık boru" alıyorum, ki bu gelişme yok.
Roger Dueck

2
@RogerDueck doğru. Bunu, Mandriva sisteminde de benzer bir problem türü için find /var/lib/mysql -xdev -type f -daystart -mmin +5 -print0 | xargs -0 ls -ldt | tail -n +1 | headgüvenilir bir sonuç için görüyorum xargs: ls: terminated by signal 13. Bildiğimiz gibi, sorun girdi yorgunluğundan biridir ve gerçekten tamponlama ile ilgilenen tek bir komut vardır: dd. | dd obs=1MBoru hattına eklemek , kullanım durumum için SIGPIPE'i düzeltir.
Andrew Beals

3
Önerimde daha fazla değişiklik yapacağım, ancak xargs veya type'ın SIGPIPE hakkında bilgi sahibi olması gerektiğine inanmadığımı da belirtmeliyim: type rvm | (head -1 ; dd of=/dev/null) Buna göre : Bu, elbette, tüm girdilerin işlenmesine neden olduğu için diğer önerilere benzer. , ancak ddbu tür şeyleri işlemek için en verimli program olmalıdır.
Andrew Beals

3
SIGPIPE ihlal edenlerine
Andrew Beals

2

write error: Broken pipeMesajı o boru ve bu özel durumun okuma ucunda sol hiçbir okuyucularla bir boruya yazma için çalışır bir yazma sürecine atıfta SIGPIPEsinyal belirlenen geçerli veya ana işlem tarafından ya göz ardı etmek. SIGPIPEYoksayılmaya ayarlanan ana süreçse, çocuk işleminin bunu etkileşimli olmayan bir kabukta geri alması mümkün değildir.

Ancak, öldürmek mümkündür type rvmzaman head -1açık altkabuklarda kullanarak sonlandırır. Bu yolla arka plan yapabilir , denizaltıya type rvmgönderebilir ve daha sonra açıkça öldürmek için bir tuzak kurabiliriz .typepidhead -1EXITtype rvm

trap "" PIPE        # parent process sets SIGPIPE to be ignored
bash                # start child process
export LANG=C
# create a fake rvm function
eval "
rvm() {
$(printf 'echo line of rvm code %s\n' {1..10000})
}
"

# rvm is a function
# bash: type: write error: Broken pipe
type rvm | head -1

# kill type rvm when head -1 terminates
# sleep 0: do nothing but with external command
( (sleep 0; type rvm) & echo ${!} ; wait ${!} ) | 
    (trap 'trap - EXIT; kill "$typepid"; exit' EXIT; typepid="$(head -1)"; head -1)

Grawity'nin cevabından: typebaşarısız yazmayı fark etmek, hata kodunu çevirmek ve hatta SIGPIPE tarafından öldürülmeden önce stderr'e bir hata mesajı basmak için yeterli zaman alır . Çözümünüzün üretici işleminin ( typeburada) başarısız yazıya (kapalı boru nedeniyle) tepki vermesini engellemediğini düşünüyorum, değil mi?
Piotr Dobrogost
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.