2009-10-18 21 views
9

Linux'ta bir işlemin cmdline'ı bölmeye çalışıyorum ama '\ 0' karakterleriyle ayrılmak için ona güvenemiyorum. Bazen '\ 0' karakterinin neden ayırıcı olarak kullanıldığını ve bazen düzenli bir alan olduğunu biliyor musunuz?Nasıl ayrıştırılır/proc/pid/cmdline

Yürütülebilir dosyanın adını ve yolunu almanın başka yollarını biliyor musunuz? Bu bilgiyi 'ps' ile almaya çalışıyorum, ancak her zaman tam komut satırını döndürür ve çalıştırılabilir ad kısaltılır.

Teşekkürler.

cevap

3

Karanlıkta bir atış, ancak \0'un terimleri ayırabilmesi mümkün mü? Örneğin,

myprog "foo bar" baz 

/usr/bin/myprog\0foo bar\0baz 

Komple tahminim burada, benim Linux kutulardan birinin üzerinde boşluk bulmak için görünmüyor olabilir ... olarak /proc/pid/cmdline görünebilir.

+1

Hi. Bahsettiğiniz gibi, kelimeler aynı terimle kelimeleri ayırmak için kullanılır, beklediğim şey buydu ama şartları ayırmak için boşluklar kullanan bir makineye erişimim var. Ubuntu'ydu, hangi sürümün olduğunu bilmiyordum. – ryotakatsuki

10

/proc/PID/cmdlineher zaman NUL karakterleri ile ayrılmıştır.

cat -v /proc/self/cmdline "a b" "c d e" 

EDIT: boşluk anlamak için

, bu komutu çalıştırmak belki yürütülebilir (bilerek veya bilmeyerek), herhangi olmamalıdır nerede gerçekten boşluk görürseniz argv[] yazar veya setproctitle() kullanıyor ? işlem çekirdek tarafından başlatılır

, komut_satırı NULL ayrılmış ve kernel code simply copies Eğer /proc/PID/cmdline okunduğunda argv[] çıkış tamponuna işlem başlangıçta olduğu bellek aralığı.

+0

Yukarıda da belirttiğim gibi, bir iş arkadaşına "çözümü" açıklarken, onun cmdline'larının beklediğim gibi davranmadığını fark ettim. İkimiz de Ubuntu kullanıyoruz, bu yüzden bunun kullanılan Kernel'e göre yapılandırılabilecek veya ona bağlı bir davranış olup olmadığını bilmiyorum. – ryotakatsuki

+0

Bu yanlış. Bazen argümanları ayıran boşluklar vardır - yani hepsi argv'de [0]. Bunu biliyorum çünkü bunu gördüm. – camh

+0

Argüman vektörünün programın mutabilitesi, bu yüzden ifadenize itiraz ettim. "Her zaman" demediysen ve bunu vurgulamış olsaydın yorum yapamazdım. – camh

2

Cevabım here'a bir bakın. Bunu kendim yapmaya çalışırken bulduğum şeyi kapsar.

Düzenleme: İstediğinizi yapmak için elinden gelenin en iyisini yapmaya çalışan bir bash betiği için debian kullanıcısı this konusuna bakın (bu iş parçacığındaki komut dosyasının 3. sürümüne bakın).

+0

Merhaba. Zaten süreçleri yoluna göre izlemeye benzer bir şey yapıyorum, exe symlink'i okuyordum, ama büyük sorun cmd'de çalıştırılabilir ismin elde edilmesidir. Demek istediğim, genellikle bir süreç çalıştırıcısına atıfta bulunduğunuzda: "Emacs PID'sini istiyorum", yani "/ usr/bin/emacs22-gtk" yi exe olarak değil, "emacs" bulmayı beklersiniz. Gözden geçirmediğim, readlink tarafından bildirilen '(Silindi)' dizesidir. Bilgileri cmdline olarak bölebilseydim, bilgisini 'exe' tarafından verilen ile karıştırabilirdim. Her durumda, belli bir yolu yok gibi görünüyor :). Teşekkürler! – ryotakatsuki

+0

Uygulamamı içeren bir komut dosyası yayınladığım bir iş parçacığına bağlantı ekledim. İçinde bir boşluk ile bir yürütülebilir adı işlemez, ama onlar nadir (hiç görmedim çok nadir) – camh

+0

Uaaa ... Büyük iş, teşekkürler! – ryotakatsuki

14

kullanım strings

$ cat /proc/self/cmdline | strings -1 
cat 
/proc/self/cmdline 
6

Kullanım

cat /proc/2634/cmdline | tr "\0" " " 

bir komut satırında göreceği gibi, boşlukları ile ayrılan args alır.

+0

Tek başına "tr" yapabildiğinde "cat + tr" kullanmanıza gerek yok, bkz. @ Hek2mgl cevap. –

4

/proc/PID/cmdline'daki komut satırı bağımsız değişkenleri, boş baytlarla ayrılır. Yeni çizgilerle bunların yerine tr kullanabilirsiniz:

tr '\0' '\n' < /proc/"$PID"/cmdline