2010-07-15 21 views
19

En un programa C, puedo escribir argv [0] y el nuevo nombre aparece en una lista ps.¿Cómo cambiar argv0 en bash para que el comando aparezca con un nombre diferente en ps?

¿Cómo puedo hacer esto en bash?

+0

¿Quiere decir que quiere ejecutar un script de shell bash y su nombre en * ps * aparece como algo diferente a "bash"? – Karmastan

+0

Si escribo un script llamado 'foo.sh', aparece en _ps_ como foo.sh. Quiero que se muestre como 'bar.sh'. – bstpierre

+0

por cierto, dudo que escribir argv0 sea legal, especialmente si lo que escribe es más largo que el original, pero necesito encontrar una referencia para este – frankc

Respuesta

10

He tenido la oportunidad de revisar la fuente de bash y no parece que haya ningún soporte para escribir en argv [0].

25

Puede hacerlo al ejecutar un nuevo programa a través de exec -a <newname>.

+1

+1: y para agregar a lo anterior, podría tener un "si $ 0 no es lo que quiero, luego 'exec -a what_i_want'" en la parte superior ... – eruciform

+1

Parece que no tiene ninguno Afectar para mí en Bash 4.0.33 –

+4

Desafortunadamente, no afecta a la shell * actual *. Tienes que abrir uno nuevo usándolo. –

6
(exec -a foo bash -c 'echo $0') 
+0

Esto * reiniciará * el proceso. No es lo mismo que escribir en argv [0] para cambiar el nombre. – bstpierre

+1

Bueno, abre una subshell, luego reemplaza esa subshell con el proceso iniciado por 'exec'. Eso es casi idéntico a lo que sucede cuando simplemente escribes 'bash -c 'echo $ 0'' – chepner

0

Voy a agregar que esto debe ser posible en tiempo de ejecución, al menos en algunos entornos. Asignar $ 0 en Perl en Linux cambia lo que aparece en ps. Sin embargo, no sé cómo se implementa eso. Si puedo averiguarlo, actualizaré esto.

editar: Según lo que hace perl, no es trivial. Dudo que haya algo hecho en el camino en tiempo de ejecución pero no estoy seguro. Usted puede ver how perl does sets the process name at runtime.

5

Supongo que tiene un script de shell que desea ejecutar de modo que el proceso de script tenga un nuevo argv[0]. Por ejemplo (solo he probado esto en bash, entonces lo estoy usando, pero esto puede funcionar en otro lado).

#!/bin/bash 

echo "process $$ here, first arg was $1" 
ps -p $$ 

La salida será algo como esto:

$ ./script arg1 
process 70637 here, first arg was arg1 
    PID TTY   TIME CMD 
70637 ttys003 0:00.00 /bin/bash ./script arg1 

Así ps muestra la concha, /bin/bash en este caso. Ahora probar su caparazón de exec -a interactiva, pero en un subnivel para que no soplar a los shell interactivo:

$ (exec -a MyScript ./script arg1) 
process 70936 here, first arg was arg1 
    PID TTY   TIME CMD 
70936 ttys008 0:00.00 /bin/bash /path/to/script arg1 

Woops, aún mostrando /bin/bash. ¿que pasó? El exec -a probablemente estableció argv[0], pero luego se inició una nueva instancia de bash porque el sistema operativo leyó #!/bin/bash en la parte superior de la secuencia de comandos. Ok, ¿y si ejecutamos la ejecución dentro del guión de alguna manera? Primero, necesitamos alguna forma de detectar si esta es la "primera" ejecución del script, o la segunda instancia de ed exec; de lo contrario, la segunda instancia se ejecutará nuevamente, y así sucesivamente en un bucle infinito. A continuación, necesitamos el ejecutable en , no en, un archivo con una línea #!/bin/bash en la parte superior, para evitar que el sistema operativo cambie nuestra argv [0] deseada. Aquí está mi intento:

$ cat ./script 
#!/bin/bash 

__second_instance="__second_instance_$$" 
[[ -z ${!__second_instance} ]] && { 
    declare -x "__second_instance_$$=true" 
    exec -a MyScript "$SHELL" "$0" "[email protected]" 
} 

echo "process $$ here, first arg was $1" 
ps -p $$ 

Gracias a this answer, yo primera prueba para la variable de entorno __second_instance_$$, basado en el PID (que no cambia a través exec) para que no colisione con otros scripts usando esta técnica. Si está vacío, supongo que esta es la primera instancia, y exporto esa variable de entorno, luego ejecuto. Pero, lo que es más importante, no ejecuto esta secuencia de comandos, pero ejecuto el binario de la shell directamente, con esta secuencia de comandos ($0) como argumento, pasando junto con todos los demás argumentos ([email protected]). La variable de entorno es un poco pirata.

Ahora el resultado es el siguiente:

$ ./script arg1 
process 71143 here, first arg was arg1 
    PID TTY   TIME CMD 
71143 ttys008 0:00.01 MyScript ./script arg1 

Eso es casi allí.El argv[0] es MyScript como yo quiero, pero existe ese arg ./script adicional que es consecuencia de ejecutar el shell directamente (en lugar de hacerlo a través del proceso #! del sistema operativo). Lamentablemente, no sé cómo hacer nada mejor que esto.

9

Sólo para que conste, a pesar de que no responde exactamente a la pregunta de su creador original, esto es algo trivial que ver con zsh:

ARGV0=emacs nethack 
0

Copiar el ejecutable fiesta con un nombre diferente.

Usted puede hacer esto en el propio guión ...

cp /bin/bash ./new-name 
PATH=$PATH:. 
exec new-name $0 

Si usted está tratando de fingir que no es un script que puede cambiar el nombre del script mismo a algo fresco o incluso "" (una sola espacio) por lo

exec new-name " " 

ejecutará la secuencia de comandos de bash y aparece en la lista como ps solo new-name.

bien así que llama a un script "" es una muy mala idea :)

Básicamente, para cambiar el nombre

bash script 

fiesta de cambio de nombre y cambiar el nombre del script.

Si está preocupado, como Mr McDoom. al parecer, es decir, sobre la copia de un archivo binario a un nuevo nombre (que es totalmente seguro) también se puede crear un enlace simbólico

ln -s /bin/bash ./MyFunkyName 
./MyFunkyName 

De esta manera, el enlace simbólico es lo que aparece en la lista ps. (otra vez use PATH = $ PATH :. si no quiere el ./)

+0

Espero que ningún novato haya visto literalmente cambiar el nombre de bash y renombrar el script. ¡Estoy seguro de que esto rompería muchas cosas! – mcdoomington

+0

:) comienza con "** Copiar ** el ejecutable bash con un nombre diferente". y los comandos son claros. Hago esto bastante si quiero un bin con un nombre diferente, no rompe nada para cambiar el nombre de un binario, claramente necesitas dejar/bin/bash donde está. A veces, los contenedores funcionan de manera diferente según el nombre utilizado, pero generalmente también tienen un comportamiento predeterminado. Lo hago mucho con bash desde que piratee el código bash y compilo mis propias versiones. – teknopaul

+0

Hola Teknopaul, sí (lo leí y entendí), pero sabes cómo funciona copiar y pegar SO champs - quizás edites la respuesta para decir POR QUÉ copias Bash a otro nombre;) Si alguien cambia el verdadero bash ...se darán un paseo si se reinician y no tienen avisos. – mcdoomington

Cuestiones relacionadas