¿Cómo puedo ejecutar go-ethereum como proceso daemon en Ubuntu?

Las Instrucciones de instalación para Ubuntu sugieren ejecutar gethdesde la línea de comandos, ¿cómo puedo ejecutarlo como un proceso/servicio daemon en Ubuntu?

Respuestas (5)

Ejecutar como un servicio systemd

Crear un archivo geth.service:

[Unit]
Description=Ethereum go client

[Service]
Type=simple
ExecStart=geth 2>%h/.ethereum/geth.log

[Install]
WantedBy=default.target

Habilitar servicio:

systemctl --user enable geth.service
systemctl --user start geth.service

fuente _

Alternativamente, podría usar la pantalla:

sudo apt-get update && sudo apt-get install screen -y

Entonces puedes hacer un bash similar a este ( ~/geth.sh):

#!/usr/bin/env bash
echo "Starting geth"
screen -dmS geth /usr/bin/geth --verbosity 3

ahora hagámoslo ejecutable:

sudo chmod +x ~/geth.sh

Ahora puede ejecutar el bash~/geth.sh

Te adjuntas a la pantalla con screen -x geth

Te separas de la pantalla presionando CTRL + a y luego d

Si desea conectarse a la consola geth después de que el proceso se ejecute en segundo plano (o en la pantalla), puede usar:

geth attach

fuente _

O simplemente bifurcarlo en segundo plano:

Al iniciar geht, coloque una &al final del comando en una terminal:

geth --rpc &

Antes de cerrar la terminal debes desautorizar el proceso:

disown

También puede canalizar los registros a un archivo como ese:

geth --verbosity 4 --rpc 2>> /path/to/logfile

Pero no olvide repudiarlo antes de cerrar la terminal.

fuente _

Gran respuesta. Sin embargo, el "systemd" probablemente debería ser el primer ejemplo, al menos es lo que esperaba encontrar como la mejor respuesta.
Tiene mi voto, pero está de acuerdo en que la sección systemd es probablemente la parte más relevante de la respuesta.
actualizo la respuesta
Impresionante, esta es una excelente respuesta!
Método Systemd: no se pudo habilitar la unidad: archivo geth.service: no existe tal archivo o directorio. Estoy guardando el archivo en mi carpeta de inicio y estoy ejecutando el comando allí.
@emisilva Tuve un problema similar, que resolví cambiando: 1) cambiando el comando enable a sudo y haciendo que la ruta sea una ruta absoluta: sudo systemctl --user enable /home/ubuntu/geth.service2) también tuve que cambiar el comando a una ruta absoluta en el servicio:ExecStart=/usr/bin/geth ...
¿Por qué tenemos que repudiar? @5chdn
¿No le gustaría agregar al registro en el archivo de servicio? 2>>en lugar de 2>?
No ExecStartme funciona la línea. De acuerdo con la documentación de systemd, "Específicamente, redirección usando "<", "<<", ">" y ">>", tuberías usando "|", ejecutando programas en segundo plano usando "&" y otros elementos de la sintaxis de shell no es compatible". También encuentro, en contra de la documentación de systemd, que se necesita una ruta absoluta al binario.
¿Cómo ejecutar Geth usando sus banderas en modo demonio con su solución?

Solo usar este comando es suficiente para mí:

nohup geth --rpc &

Para comprobar si el servicio se está ejecutando:

ps ax | grep geth

Para explorar los últimos mensajes de registro:

tail -f nohup.out

Para detener el servicio que uso:

pkill geth
Para obtener una consola, geth adjuntar
killall gethparece una mejor opción para detener el proceso geth.
eso es exactamente lo que necesito!
@alper killall gethno funciona connohup
@ e18r prueba:kill -9 $(pgrep -f -l geth | awk '{print $1}')
@alper realmente killall gethfunciona. Solo tienes que esperar unos minutos para que se cierre con gracia

Aquí hay una actualización de la respuesta de 5chdn que usa systemd. Esto muestra cómo ejecutar un headless gethen su servidor Ubuntu.

Por supuesto, primero debe instalar las herramientas de la línea de comandos, consulte https://www.ethereum.org/cli . También debe ejecutar MyEtherWallet en su computadora de escritorio normal para crear una cuenta + clave privada para que pueda recibir fondos.

Paso 1: ponte la capa

sudo bash

Otros pasos aquí se basan en su ejecución como root. Si no está ejecutando como root, aprenda a usar systemd con procesos de usuario . tl; dr en este caso, solo se ejecutarían después de iniciar sesión, pero puede configurar para que un servicio de usuario comience como arranque

Paso 2: hacer un servicio

cat > /root/geth.service <<EOF
[Unit]
Description=Ethereum go client

[Service]
Type=simple
ExecStart=/usr/bin/geth --etherbase 0xe677698ab732Aa1E56CF2A7997a00e3FA6F5bD88 2>%h/.ethereum/geth.log

[Install]
WantedBy=default.target
EOF

Arriba, puede sustituir la etherbase de su propia billetera. Si no especifica una etherbase geth, emitirá una advertencia.

Paso 3: ejecutarlo

systemctl --user enable /root/geth.service
systemctl --user start geth.service

Esto lo ejecutará ahora y después de reiniciar.

Paso 4: pruébalo

sleep 5 # The geth server takes a few seconds to boot up
geth attach

Si geth attachtiene éxito, sabrá que el gethservidor se está ejecutando y verá:

¡Bienvenido a la consola Geth JavaScript!

Si algo salió mal, entonces verás:

Fatal: no se puede conectar a geth remoto: marcar unix /root/.ethereum/geth.ipc: conectar: ​​conexión rechazada

La mejor manera es ejecutar como systemd:

Cree el archivo geth.service (/etc/systemd/system/geth.service):

sudo nano /etc/systemd/system/geth.service

Pega lo de abajo

[Unit]
Description=Geth

[Service]
Type=simple
User={$USER}
Restart=always
RestartSec=12
ExecStart=/bin/geth --syncmode "full" --rpc --rpcaddr "0.0.0.0"

[Install]
WantedBy=default.target

Reemplace {$USUARIO} con el nombre de usuario anterior. Use useradd para crear un nuevo usuario si es necesario.

sudo useradd -d /home/newUser -m --uid 10000 newUser

Habilite e inicie el servicio:

sudo systemctl daemon-reload
sudo systemctl enable geth.service
sudo systemctl daemon-reload

service geth status
sudo service geth start

Compruebe el estado:

service geth status

Adjuntar a la instancia de geth:

geth attach

Detener y deshabilitar el servicio:

sudo service geth stop
sudo systemctl disable geth.service
sudo systemctl daemon-reload

Aunque la respuesta aceptada es excelente, no funcionó para mí. Probablemente porque estoy en AWS Linux AMI (eugh, lo sé). Tengo la intención de cambiar en algún momento (systemctl not Hasta ahora, esto parece haber funcionado para mí:

  1. Crear archivo /etc/init.d/geth-testnet
#!/bin/bash
#chkconfig: 2345 20 80
#descripción Iniciar red de prueba RPC

su ec2-user -c '/ruta/a/geth --verbosidad 3 --testnet --rpc --rpcaddr="0.0.0.0" --rpccorsdomain="*" --rpcapi="db,eth,net, web3,personal"'

  1. Correr
chmod +x geth-testnet
chkconfig --añadir geth-testnet
chkconfig --level 345 geth-testnet activado
Puede que me equivoque, pero ¿es esto parte del comando anterior: '--rpc --rpcaddr="0.0.0.0" --rpccorsdomain="*" ' abriendo puertos geth a un posible ataque? Me parece recordar una publicación hace cinco o seis meses sobre alguien que pierde ether al ejecutar geth con puertos abiertos a todo el mundo como dice esto. Aunque podría estar equivocado. Estoy seguro de que alguien me corregirá si lo estoy.
por seguridad, tal vez cualquiera que encuentre esto elimine esa parte hasta que alguien confirme o niegue lo que dijo @ThomasJayRush