liệt kê các tiến trình thuộc một không gian tên mạng


7

Tôi đang dùng Ubuntu 12.04 và iptiện ích không có ip netns identify <pid>tùy chọn, tôi đã thử cài đặt mới iproute, nhưng vẫn có tùy chọn nhận dạng dường như không hoạt động!.

Nếu tôi đã viết một tập lệnh (hoặc mã) để liệt kê tất cả các quy trình trong một không gian tên mạng hoặc được cung cấp một PID, hãy chỉ ra không gian tên mạng đó thuộc về nó, tôi nên tiến hành như thế nào? (Tôi cần thông tin về một số quy trình, để kiểm tra xem chúng có đúng không netns)

Câu trả lời:


15

Bạn có thể làm một cái gì đó như:

netns=myns
find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/"$netns" | cut -d/ -f5

Hoặc với zsh:

print -l /proc/[1-9]*/task/*/ns/net(e:'[ $REPLY -ef /run/netns/$netns ]'::h:h:t)

Nó kiểm tra nút inode của tệp mà /proc/*/task/*/ns/netsymlink trỏ tới một lần nữa với các tệp được liên kết gắn kết ip netns addtrong /run/netns. Về cơ bản đó là những gì ip netns identifyhoặc ip netns pidtrong các phiên bản mới hơn iproute2làm.

Nó hoạt động với kernel 3.13 như từ linux-image-generic-lts-trustygói trên Ubuntu 12.04, nhưng không hoạt động với kernel 3.2 từ bản phát hành đầu tiên 12.04 /proc/*/ns/*không có liên kết tượng trưng và mỗi nettệp ở đó từ mọi quy trình và tác vụ đều có một inode khác nhau không thể giúp xác định không gian tên thành viên.

Hỗ trợ cho điều đó đã được thêm vào bởi cam kết đó vào năm 2011, có nghĩa là bạn cần kernel 3.8 hoặc mới hơn.

Với các nhân cũ hơn, bạn có thể thử và chạy chương trình nghe trên ổ cắm ABSTRACT trong không gian tên, sau đó thử nhập không gian tên của mọi quy trình để xem bạn có thể kết nối với ổ cắm đó ở đó không:

sudo ip netns exec "$netns" socat abstract-listen:test-ns,fork /dev/null &
ps -eopid= |
  while read p; do
    nsenter -n"/proc/$p/ns/net" socat -u abstract:test-ns - 2> /dev/null &&
      echo "$p"
  done

Tôi đã sử dụng mẫu đầu tiên (tôi sử dụng bash), nhưng tôi gặp lỗi khi chạy find -L /proc/*/task/*/ns/net -samefile /run/netns/"$netns" find: '/proc/self/task/8964/ns/net': No such file or directory ( 8964pid hiện tại [ $$]) - tôi có nên chạy cái này trong defaultkhông gian tên không?
vyom

@vyom, có từ không gian tên pid và mount cấp cao nhất (mặc dù tôi cho rằng bạn có thể tạo netns trong các không gian tên mount khác sẽ làm mất lệnh đó).
Stéphane Chazelas

. dường như không có tác dụng đối với tôi :( Tôi cố gắng từ /, và tôi đã tạo ra netns, theo cách thông thường - ip netns addvà tôi có thể nhìn thấy nó trong /var/run/netns/Không chắc những gì tôi đang mất tích.
vyom

@vyom, có grep /run/netns /proc/self/mountinfobáo cáo gì không? Phiên bản kernel nào bạn đang sử dụng ( uname -rs)?
Stéphane Chazelas

2
ip netns helpliệt kê lệnh netns pids NAMEmà theo tôi nghĩ, được cho là liệt kê tất cả các pids trong một tên mạng.
mikeerv

3

Câu hỏi đặc biệt đề cập đến Ubuntu 12.04, nhưng tôi lưu ý rằng trên các bản phát hành mới hơn như 16.04 có một lệnh thực hiện chính xác điều này: ip netns pids <nsname>


1
Thật không may, ip netnschỉ hoạt động trên các không gian tên mạng được gắn kết /run/netns(cũng /var/run/netns). Nó hoàn toàn không biết gì về bất kỳ không gian tên mạng nào khác, hoặc được gắn kết ở những nơi khác, chẳng hạn như /run/docker, và nó đặc biệt hoàn toàn không biết gì /proc.
TheDiveO


1

Không gian tên-Lister:

Bạn có thể sử dụng listns.py với: ./listns.pyhoặc python2 listns.py ( nguồn: github-mirrorbài viết ; tất cả tín dụng cho Ralf Trezeciak )

Mạng IP :

Có thể được thực hiện bằng cách sau (thay thế tên không gian tên $):

ip netns pids $namespace-name | xargs ps -o pid,command -p

Nsutils

Cung cấp netnslistdanh sách đó tất cả các không gian tên mạng và tất cả các quy trình đang chạy trong mỗi không gian tên:


0

Khi chạy bên trong container chứ không phải bên ngoài, tôi thấy thủ thuật -samefile đáng buồn không hoạt động. Không chắc tại sao vì nó giống như inode. Dù sao, điều này tuy nhiên đã làm việc, chỉ trong trường hợp nó được sử dụng cho bất cứ ai:

netns=mynamespace
inode=$(ls -i /var/run/netns/$netns | cut -f1 -d" ")
pids=$(find -L /proc/[1-9]*/task/*/ns/net -inum $inode | cut -f3 -d"/" | uniq)
ps -p $pids
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.