2015-07-31 14 views
5

Şu anda bir işlemin işlem adını değiştirmeye çalışıyorum, böylece daha kolay htop, top, .... ile okuyabiliyorum. LD_PRELOAD bu kodu başka bir işleme dahil etmek istiyorum bir ortam değişkeni ile yeniden adlandırılır. Linux'taki gerçek işlem adını değiştirin Linux'ta

Ben internette bir sürü şey buldum, ama hiçbir şey çalışır:

prctl(PR_SET_NAME, "Test"); 

htop adını yerine getirmiyor, çünkü bu çalışmaz. Nginx setproctitle (Link), (işlem tarafından gerekli olan) parametreleri kestiği için de çalışmaz.

Bulduğum herşeyi denedim ve şimdi fikirlerim tükendi.

Bu linux da mümkün mü? Ve nasıl?

+0

kesinlikle çözmek gerekir mi Bu C kodu kullanarak? – Useless

+0

Önceden yüklenebilen .so dosyaları üretebilirse başka bir dil kullanırdım. –

+0

Asıl sorun, bir sürecin adını nasıl değiştireceğinizdir? Ve ilk çözüm, bunu başarmak için bir .so LD_PRELOAD yazıyor mu? Sistem kurulumunuzu doğru anlarsam, ilk olarak .so veya LD_PRELOAD gerektirmeyen daha basit bir çözüm olabilir. – Useless

cevap

7

Sadece exec aracılığıyla kabuk veya program tarafından programınızı çalıştırın ve argv[0] olarak istenen adı geçmesi:

#/bin/bash 
exec -a fancy_name a.out ... 

veya C/C++:

execl("./a.out", "fancy_name", ...); 
+0

Soru, 'C++' ve 'bash' ya da koşma ile ilgili değildir. –

+0

Doğru, ama bir X-Y problemi gibi geliyor. Hadi soralım! – Useless

+0

@VictorPolevoy OP'nin bunu C ile çözmek istediğine inanıyorum çünkü o kabuk ile daha basit bir çözüm olduğunu bilmez. Neyse, C/C++ koduyla çok benzer şekilde yapılır, bu örneği ekledim. – Slava

4
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#define NEW_NAME "hello_world" 
int main(int argc, char **argv) { 
    if(strcmp(argv[0], NEW_NAME)) { 
    argv[0] = NEW_NAME; 
    execv("/proc/self/exe", argv); 
    fputs("exec failed", stderr); 
    return 1; 
    } 
    while(1) // so it goes to the top 
    ; 
}