Diferencia entre systemctl init.d y service

40

Soy nuevo en Linux y me he estado probando usando una instancia de Amazon Lightsail (Ubuntu 16.04 LTS).

Al revisar las muchas guías que he encontrado, veo personas que utilizan diferentes comandos para iniciar / detener / reiniciar / recargar / verificar el estado de un servicio. Específicamente estos;

sudo systemctl status apache2.service
sudo /bin/systemctl status apache2.service
sudo /etc/init.d/apache2 status
sudo service apache2 status

Todos los comandos anteriores funcionan.

  1. ¿Debería preferir un comando sobre el otro?
  2. En caso afirmativo, ¿por qué?
  3. ¿Hay otros comandos que deba tener en cuenta?

El uso de init.d en Monit causó problemas cuando quería usar la opción de estado (el estado será que el servicio está fuera de línea cuando realmente estaba en línea, reiniciado por Monit). Cambie el código en Monit de inid.d a / bin / systemctl lo arregló.

Parece que el uso de init.d proporciona más información sobre lo que sucedió que los demás. Si debo usar uno de los otros comandos, ¿es posible que muestren más información sobre lo que se hizo?

ubuntu@ip-172-26-12-245:~$ sudo systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /bin/systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /etc/init.d/pure-ftpd restart
[ ok ] Restarting pure-ftpd (via systemctl): pure-ftpd.service.
ubuntu@ip-172-26-12-245:~$ sudo service pure-ftpd restart
ubuntu@ip-172-26-12-245:~$

Quisiera agradecer de antemano a todos los que se han tomado el tiempo de leer y responder a esta pregunta.

Waqas Tariq
fuente
En Linux a menudo hay más de una forma de realizar una acción. No hay uno que sea mejor o peor, correcto o incorrecto. Personalmente, uso el que menos escribe. Muchos de estos comandos pueden ser enlaces simbólicos o compatibilidad inversa a medida que Ubuntu cambia a systemd.
Panther
systemctles la sintaxis preferida y servicese proporciona como compatibilidad con versiones anteriores. /etc/init.d/pure-ftpdo similar están llamando a los scripts de inicio / detención directamente.
Panther

Respuestas:

57

Para empezar, hay toda una historia y una lucha entre ir de SysVInita SystemD. Sin embargo, en lugar de tratar de desglosar todo esto en una respuesta, lo referiré a algunas empresas de Google para obtener más detalles sobre la historia, así como un artículo en particular sobre el tema:

http://www.tecmint.com/systemd-replaces-init-in-linux/

En resumen, sin embargo, ha sido una transición lenta y ardua. Algunas características heredadas se mantuvieron intactas (como init.dhasta cierto punto). Si tiene la opción de usar systemctlpara el control de su servicio, le recomiendo usar esa. Es el futuro previsible para Linux y, finalmente, los SysVInitmétodos más antiguos se considerarán obsoletos por completo y se eliminarán.

Para cubrir cada uno que enumeró específicamente:

  1. sudo systemctl status apache2.service

Este es el nuevo SystemDenfoque para el manejo de servicios. En el futuro, las aplicaciones en Linux están diseñadas para usar el método systemd, no cualquier otro.

  1. sudo /bin/systemctl status apache2.service

Esto es lo mismo que el comando anterior. La única diferencia en este caso es que no depende de la $PATHvariable de entorno del shell encontrar el comando, sino que enumera el comando explícitamente al incluir la ruta al comando.

  1. sudo /etc/init.d/apache2 status

Este es el SysVInitmétodo original de llamar a un servicio. Los scripts de inicio se escribirían para un servicio y se colocarían en este directorio. Si bien este método todavía es utilizado por muchos, servicefue el comando que reemplazó este método de invocar servicios SysVInit. Hay algunas funcionalidades heredadas para esto en los sistemas SystemDmás nuevos, pero la mayoría de los programas más nuevos no incluyen esto, y no todos los scripts de inicio de aplicaciones más antiguos funcionan con él.

  1. sudo service apache2 status

Esta fue la herramienta principal utilizada en los SysVInitsistemas de servicios. En algunos casos simplemente se vinculó a los /etc/init.d/scripts, pero en otros casos fue a un script de inicio almacenado en otro lugar. Estaba destinado a proporcionar una transición más fluida en el manejo de la dependencia del servicio.


Por último, menciona que desea saber cómo obtener más información de los comandos, ya que algunos proporcionan más información que otros. Esto casi siempre está determinado por la aplicación y cómo diseñaron su archivo de inicio o servicio. Sin embargo, como regla general, si se completó en silencio, tuvo éxito. Sin embargo, para verificar a start, stopo restart, puede usar el statussubcomando para ver cómo está funcionando. Usted mencionó que un statuscomando es incorrecto en un script de inicio antiguo. Ese es un error que los desarrolladores de aplicaciones tendrían que mirar. Sin embargo, dado que los scripts de inicio se están convirtiendo en el método obsoleto de manejo de servicios, pueden ignorar el error hasta que eliminen por completo la opción de script de inicio. lossystemctl status siempre debe funcionar correctamente; de ​​lo contrario, se debe registrar un error con los desarrolladores de la aplicación.

Sombrero de copa
fuente
Muchas gracias por tu respuesta detallada. También estoy buscando respuestas en Google, pero esta realmente me confundió, así que lo publiqué aquí. También veo que sudo systemctl status apache2 funciona, en lugar de (sudo systemctl status apache2.service). ¿Hay algún daño en renunciar a la parte .service?
Waqas Tariq
@WaqasTariq no hay problema! Ambos deberían funcionar, systemctlbuscarán en los directorios donde se almacenan los archivos de servicio y agregarán el ".service" si lo encuentra. Entonces, por ejemplo, si presiona la pestaña una vez después de solo escribirlo sudo systemctl status apache2, debe completarlo agregando .servicepara usted. Si hay más de un archivo systemctl apache2 (como .servicey .targetque tendría que pestaña golpe dos veces para que todos las opciones disponibles muestra.
TopHat
Lo tengo. Gracias por sus respuestas y su tiempo.
Waqas Tariq
@WaqasTariq de nada!
TopHat