Estoy desarrollando un demonio que está funcionando mal y ahora no puedo crear ningún proceso nuevo (es decir, no puedo iniciar un nuevo proceso para eliminar los otros procesos no autorizados). Por lo tanto, necesito poder finalizar los procesos desde una máquina remota. ¿Cómo puedo "matar" de forma remota sin privilegios de administrador? Si no puedo eliminar mi propio proceso desde una máquina remota como usuario normal, dímelo para poder marcarlo como la respuesta correcta.
Respuesta1
Para eliminar un proceso que se ejecuta en una máquina, algún proceso local (o el núcleo) debe emitir la señal de eliminación. Por lo tanto, necesita una manera de hacer que un proceso emita esa señal y, dado que no puede crear un proceso nuevo, necesita encontrar una manera que dependa exclusivamente de los procesos que ya se están ejecutando.
No existe ningún demonio estándar que pueda ayudarte en ese sentido. Todos procesarían su autenticación y luego bifurcarían un nuevo proceso (como un shell) que se ejecutaría como usted. Entonces, si no tiene acceso a la consola y no tiene interacción con la máquina, no tiene suerte.
Según sus comentarios, parece que todavía tiene un shell en la máquina. Luego hay cosas que puedes hacer. No puede ejecutar ningún proceso externo, como ls
o ps
. Pero puede ejecutar comandos integrados como echo
, read
y kill
( kill
no está integrado en todos los shells, pero sí en todos los shells que admiten el control de trabajos, como bash y zsh).
Cada proceso tiene un directorio asociado en /proc
: /proc/12345
donde 12345 es la identificación del proceso. Por lo tanto, puede obtener información sobre la existencia explorando /proc
. echo
con comodines es útil aquí, por ejemplo, cd /proc; echo [0-9]*
muestra los identificadores de todos los procesos en ejecución. Si el shell es zsh, puedes hacer mucho con los calificadores globales; por ejemplo, echo /proc/*(u$UID)
muestra solo los procesos que se ejecutan con su identificación de usuario.
Una forma de mostrar el contenido de un archivo sin bifurcar es
while read -r line; do
echo "$line"
done </path/to/file
Puedes eliminar muchos procesos a la vez pasándolos todos a kill
. Si ha identificado un proceso que pertenece a su demonio, intente eliminar su grupo de procesos con kill -9 -PGID
la identificación PGID
del proceso del líder del grupo. Puede encontrar la identificación del grupo de procesos del proceso 123 con </proc/123/stat read pid tcomm state ppid pgrp sid more; echo $pgrp
. (La misma información existe en una forma más legible en /proc/123/
pero no estás en buenas condiciones para leerla). También puedes intentar enviar una señal a todos tus procesos (incluido el shell de origen) con
trap : NUM
kill -NUM -1
Elija valores de NUM distintos de KILL
(9) para que el trap
comando haga que su shell ignore la señal ( KILL
no puede ser atrapado).
Respuesta2
La siguiente información fue encontrada enhttp://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/
Elimine el proceso usando el comando kill en Linux/UNIX
El comando kill funciona tanto en sistemas operativos tipo Linux como UNIX/BSD.
Paso 1: primero, debe averiguar el PID del proceso (identificación del proceso)
Utilice el comando ps o el comando pidof para averiguar el ID del proceso (PID). Sintaxis: ps aux | grep nombre del proceso pidof nombre del proceso
Por ejemplo, si el nombre del proceso es lighttpd, puede utilizar cualquiera de los siguientes comandos para obtener el ID del proceso:
ps aux | grep lighttpdOutput
lighttpd 3486 0.0 0.1 4248 1432 ? S Jul31 0:00 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
lighttpd 3492 0.0 0.5 13752 3936 ? Ss Jul31 0:00 /usr/bin/php5-cg
O use el comando pidof que se usa para encontrar el ID del proceso de un programa en ejecución:
pidof lighttpd
Producción
3486
Paso # 2: elimine el proceso usando PID (identificación del proceso)
El comando anterior le indica el PID (3486) del proceso lighttpd. Ahora finalice el proceso usando este PID:
# kill 3486
O
# kill -9 3486
Donde -9 es una señal de interrupción especial, que finalizará el proceso.
ejemplos de comandos killall
NO UTILICE el comando killall en el sistema UNIX (comando solo Linux). También puedes usar el comando Killall. El comando killall elimina procesos por nombre (no es necesario encontrar PID):
# killall -9 lighttpd
Mata el proceso de Firefox:
# killall -9 firefox-bin
Como dije antes, killall en el sistema UNIX hace algo más. Mata todos los procesos y no solo procesos específicos. No utilice Killall en el sistema UNIX (use Kill -9).
Respuesta3
Como dijiste en tu comentario, un administrador es la única persona que puede ayudarte en este momento. te sugiero que obtengasel libro de cocina de Perly lea la sección 16.19 para conocer el método correcto para manejar zombis.