O comando service
é um script wrapper que permite que os administradores do sistema iniciem, interrompam e verifiquem o status dos serviços sem se preocupar muito com o sistema init real em uso. Antes da introdução do systemd, era um wrapper para /etc/init.d
scripts e o comando initctl
do Upstart, e agora é um wrapper para esses dois e systemctl
também.
Verifica para Upstart:
# Operate against system upstart, not session
unset UPSTART_SESSION
if [ -r "/etc/init/${SERVICE}.conf" ] && which initctl >/dev/null \
&& initctl version 2>/dev/null | grep -q upstart \
&& initctl status ${SERVICE} 2>/dev/null 1>/dev/null
then
# Upstart configuration exists for this job and we're running on upstart
Se isso não funcionar, procure por systemd:
if [ -d /run/systemd/system ]; then
is_systemd=1
fi
...
# When this machine is running systemd, standard service calls are turned into
# systemctl calls.
if [ -n "$is_systemd" ]
then
E se isso falhar, ele volta para os scripts do System V /etc/init.d
:
run_via_sysvinit() {
# Otherwise, use the traditional sysvinit
if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
exec env -i LANG="$LANG" LANGUAGE="$LANGUAGE" LC_CTYPE="$LC_CTYPE" LC_NUMERIC="$LC_NUMERIC" LC_TIME="$LC_TIME" LC_COLLATE="$LC_COLLATE" LC_MONETARY="$LC_MONETARY" LC_MESSAGES="$LC_MESSAGES" LC_PAPER="$LC_PAPER" LC_NAME="$LC_NAME" LC_ADDRESS="$LC_ADDRESS" LC_TELEPHONE="$LC_TELEPHONE" LC_MEASUREMENT="$LC_MEASUREMENT" LC_IDENTIFICATION="$LC_IDENTIFICATION" LC_ALL="$LC_ALL" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" ${ACTION} ${OPTIONS}
else
echo "${SERVICE}: unrecognized service" >&2
exit 1
fi
}
...
run_via_sysvinit
Como o comando service
é um wrapper bastante simples, ele suporta apenas um subconjunto limitado de ações comparado ao que o sistema init real pode fornecer.
Para portabilidade em várias versões do Ubuntu, os usuários podem usar com segurança o comando service
para iniciar, parar, reiniciar ou examinar o status de um serviço. Para tarefas mais complexas, no entanto, o comando real sendo usado, seja que initctl
ou systemctl
ou o script /etc/init.d
possa ter que ser usado diretamente.
Além disso, por ser um wrapper, o script service
em alguns casos também faz mais do que o comando equivalente direto pode fazer. Por exemplo:
- Ele sempre executa
/etc/init.d
scripts em um ambiente limpo. (Observe a invocação do comando longenv
na funçãorun_via_sysvinit
acima.) - Ele mapeia
restart
em sistemas Upstart para uma combinação destop
/start
, já que uminitctl restart
simples terá erro se o serviço ainda não estiver em execução. -
Para os sockets ao parar os serviços do systemd que possuem sockets associados:
case "${ACTION}" in restart|status) exec systemctl $sctl_args ${ACTION} ${UNIT} ;; start|stop) # Follow the principle of least surprise for SysV people: # When running "service foo stop" and foo happens to be a service that # has one or more .socket files, we also stop the .socket units. # Users who need more control will use systemctl directly.
Os serviços do Upstart foram ativados diretamente no arquivo de configuração do serviço (ou desativados por meio de substituições) e os scripts do System V foram ativados ou desativados com o comando update-rc.d
(que gerenciava links simbólicos nos diretórios /etc/rc*
), portanto o service
command nunca esteve envolvido em ativar ou desativar serviços na inicialização.