{"id":18023589,"url":"https://github.com/jeffotoni/systemctl","last_synced_at":"2025-03-27T00:30:38.976Z","repository":{"id":134047522,"uuid":"132765768","full_name":"jeffotoni/systemctl","owner":"jeffotoni","description":"Criando um script de inicialização em linux usando systemctl","archived":false,"fork":false,"pushed_at":"2018-08-14T14:26:45.000Z","size":27,"stargazers_count":12,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-22T17:24:40.202Z","etag":null,"topics":["bash","golang","linux-system","script","shell-script","ubuntu-server"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jeffotoni.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-05-09T14:05:30.000Z","updated_at":"2024-07-30T13:00:46.000Z","dependencies_parsed_at":null,"dependency_job_id":"ba9f2715-c003-4752-8491-8c21d1a1deca","html_url":"https://github.com/jeffotoni/systemctl","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffotoni%2Fsystemctl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffotoni%2Fsystemctl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffotoni%2Fsystemctl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffotoni%2Fsystemctl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jeffotoni","download_url":"https://codeload.github.com/jeffotoni/systemctl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245760541,"owners_count":20667886,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","golang","linux-system","script","shell-script","ubuntu-server"],"created_at":"2024-10-30T07:09:58.213Z","updated_at":"2025-03-27T00:30:38.968Z","avatar_url":"https://github.com/jeffotoni.png","language":"Shell","readme":"# systemctl\n\nCriando um script de inicialização em linux usando systemctl.\n\nExistem formas diferentes conforme o sistema de inicialização em um sistema linux pode ser utilizado: Systemd ou System V (ou Sysvinit). Uma variação. Uma das principais razões para o Debian mudar do SysV para o systemd é a popularização de computadores com mais de um núcleo, de modo aproveitar melhor o paralelismo do que a tentativa realizada pelo Upstart (da Canonical, que mantém o Ubuntu).\n\nO systemd é compatível com o SysV e Scripts de init LSB (Linux Standard Base), mas possui padrões diferentes para conter basicamente a mesma informação. O comando service é uma ferramenta de “compatibilidade” para ajudar as pessoas a migrar de sysvinit para systemd. \n\nO Systemd é um sistema init e gerenciador de sistemas que está se tornando amplamente o novo padrão para máquinas Linux. \nEmbora existam opiniões consideráveis ​​sobre se o systemd é uma melhoria em relação aos sistemas init tradicionais do SysV que ele está substituindo, a maioria das distribuições planeja adotá-lo ou já o fez.\n\nNeste guia, discutiremos o comando systemctl, que é a ferramenta central de gerenciamento para controlar o sistema init. Abordaremos como gerenciar serviços, verificar status, alterar estados do sistema e trabalhar com os arquivos de configuração.\n\nObserve que, embora o systemd tenha se tornado o sistema init padrão para muitas distribuições do Linux, ele não é implementado universalmente em todas as distribuições. Conforme você passa por este tutorial, se o seu terminal gerar a mensagem de erro bash: systemctl não está instalado, é provável que sua máquina tenha um sistema init diferente instalado.\n\nPara mais informações pode visitar o site [debina/LSBInitScripts](https://wiki.debian.org/LSBInitScripts).\n\n### Alguns comandos do systemctl\n\nPara iniciar um serviço systemd, use o comando start. Se você estiver executando como um usuário não-root, será necessário usar o sudo.\n\n```sh\n\n$ sudo systemctl start application.service\n\n```\n\nComo mencionamos acima, o systemd sabe procurar arquivos * .service para comandos de gerenciamento de serviço, para que o comando seja facilmente digitado assim:\n\n```sh\n\n$ sudo systemctl start application\n\n```\n\nPara parar um serviço atualmente em execução, você pode usar o comando stop:\n\n```sh\n\n$ sudo systemctl stop application.service\n\n```\n\nPara reiniciar um serviço em execução, você pode usar o comando restart:\n\n```sh\n\n$ sudo systemctl restart application.service\n\n```\n\nSe o aplicativo em questão puder recarregar seus arquivos de configuração (sem reiniciar), você poderá emitir o comando reload para iniciar o processo:\n\n```sh\n\n$ sudo systemctl reload application.service\n\n```\n\nAtivando e desativando serviços\n\nPara dizer ao systemd para iniciar serviços automaticamente na inicialização, você deve ativá-los.\n\nPara iniciar um serviço na inicialização, use o comando enable:\n\n```sh\n\n$ sudo systemctl enable application.service\n\n```\nIsso criará um link simbólico da cópia do sistema do arquivo de serviço (geralmente em /lib/systemd/system ou /etc/systemd/system) para o local no disco onde systemd procura por arquivos de autoinicialização (geralmente /etc/systemd/system/multi-user.target.wants).\n\n#### Algumas Tags:\n\n - multi-user.target.wants\n - bluetooth.target.wants\n - default.target.wants\n - display-manager.service.wants\n - final.target.wants\n - getty.target.wants\n - timers.target.wants\n\nPara desativar o serviço seja iniciado automaticamente, você pode digitar:\n\n```sh\n\n$ sudo systemctl disable application.service\n\n```\n\nPara verificar o status de um serviço no seu sistema, você pode usar o comando status:\n\n```sh\n\n$ sudo systemctl status application.service\n\n```\nIsso fornecerá o estado do serviço, a hierarquia do cgroup e as primeiras linhas de log.\n\nPor exemplo, ao verificar o status do serviço \"redis\", você pode ver a saída assim:\n\n```\n\n➜  systemctl git:(master) ✗ sudo systemctl status redis\n● redis-server.service - Advanced key-value store\n   Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)\n   Active: active (running) since Thu 2018-05-10 13:49:25 -03; 2h 32min ago\n     Docs: http://redis.io/documentation,\n           man:redis-server(1)\n  Process: 1426 ExecStartPost=/bin/run-parts --verbose /etc/redis/redis-server.post-up.d (code=exited, status=0/SUCCESS)\n  Process: 1321 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)\n  Process: 1202 ExecStartPre=/bin/run-parts --verbose /etc/redis/redis-server.pre-up.d (code=exited, status=0/SUCCESS)\n Main PID: 1425 (redis-server)\n    Tasks: 4 (limit: 4915)\n   Memory: 3.8M\n      CPU: 16.350s\n   CGroup: /system.slice/redis-server.service\n           └─1425 /usr/bin/redis-server 127.0.0.1:6379\n\nmai 10 13:49:25 netcatc systemd[1]: Starting Advanced key-value store...\nmai 10 13:49:25 netcatc run-parts[1202]: run-parts: executing /etc/redis/redis-server.pre-up.d/00_example\nmai 10 13:49:25 netcatc run-parts[1426]: run-parts: executing /etc/redis/redis-server.post-up.d/00_example\nmai 10 13:49:25 netcatc systemd[1]: Started Advanced key-value store.\n\n```\n\nIsso oferece uma boa visão geral do status atual do aplicativo, notificando você sobre quaisquer problemas e ações que possam ser necessárias.\n\nExistem também métodos para verificar estados específicos. Por exemplo, para verificar se uma unidade está atualmente ativa (em execução), você pode usar o comando is-active:\n\n```sh\n\n$ sudo systemctl is-active application.service\n\n```\n\nIsso retornará o estado atual da unidade, que geralmente está ativo ou inativo. O código de saída será \"activating\" se estiver ativo.\nPara ver se a unidade está ativada, você pode usar o comando is-enabled:\n\n```sh\n\n$ sudo systemctl is-enabled application.service\n\n```\n O código de saída será \"enabled\" se o application estiver habilitado.\n\nTemos também o is-failed retornará \"activating\" se estiver funcionando corretamente ou \"inactive\" se ocorrer um erro. Se a unidade foi parada intencionalmente, ela pode retornar unknown ou inactive. Um status de saída \"0\" indica que ocorreu uma falha e um status de saída \"1\" indica qualquer outro status.\n\n```sh\n \n $ sudo systemctl is-failed application.service\n\n ```\n\n\n### Listando Unidades do systemctl\n\nPara ver uma lista de todas as unidades ativas que o systemd conhece, podemos usar o comando list-units:\n\n```sh\n\n$ sudo systemctl list-units\n\n```\n\nVocê pode usar outros sinalizadores para filtrar esses resultados. Por exemplo, podemos usar o sinalizador --state = para indicar os estados LOAD, ACTIVE ou SUB que desejamos visualizar. Você terá que manter o sinalizador --all para que systemctl permita que unidades não ativas sejam exibidas:\n\n```sh\n\n$ sudo systemctl list-units --all --state=inactive\n\n```\n\nOutro filtro comum é o --type=filter. Podemos dizer ao systemctl para exibir apenas unidades do tipo em que estamos interessados. Por exemplo, para ver apenas unidades de serviço ativas, podemos usar:\n\n```sh\n\n$ sudo systemctl list-units --type=service\n\n```\n\n### Listando todos os arquivos da unidade\n\nO comando list-units exibe apenas as unidades que o systemd tentou analisar e carregar na memória. Como o systemd só irá ler as unidades que julgar necessárias, isso não incluirá necessariamente todas as unidades disponíveis no sistema. Para ver todos os arquivos de unidade disponíveis dentro dos caminhos do systemd, incluindo aqueles que o systemd não tentou carregar, você pode usar o comando list-unit-files em vez disso:\n\n```sh\n\n$ sudo systemctl list-unit-files\n\n```\n### Criando e organizando nossos scripts e Daemon.\n\n#### Script httphello.sh\n\nO arquivo do exemplo a seguir deve ser colocado dentro de **/etc/init.d/**.\n\nTemos que criar nosso script para controlar todas as etapas de **start|stop|restart|reload|status** do nosso programa que será executado, iremos chama-lo de httphello.sh que irá ser responsável por gerenciar nosso executável que irá ser inicializado no boot do sistema. Para ficar mais bacana iremos renomer **httphello.sh** para **httphello**\n\n#### System V (SysV ou sysvinit)\n\nVamos criar nosso script para gerenciar os eventos: **start|stop|restart|reload|status** não esqueça de coloca-lo em **/etc/init.d/**, **chmod +x httphello**\n\nÉ possível colocar o script diretamente no diretório **/etc/init.d**. Para criar o link simbólico de modo a permitir a execução na inicialização para isto temos que rodar o seguinte comando **“sudo update-rc.d httphello defaults**, caso queira removê-lo, utilize **remove** em vez de **defaults**. Mais detalhes do boot do linux clique aqui [Boot linux](https://www.thegeekstuff.com/2011/02/linux-boot-process/)\n\nUm script LSB (Linux Standard Base) Init tem como principal finalidade a execução de comandos na inicialização do sistema operacional seguindo uma padronização. Para isso, ele deve ter suporte para as seguintes ações: **start|stop|restart|reload|status**. \n\nDeverá ter saída de erros apropriada e ter as **run-time dependencies**: um cabeçalho padrão no início do script com as informações necessárias ao seu funcionamento.\n\nConfira as funções que ficam comentadas no inicio do script são como annotations.\n\n - Provides:\t \t\tespecifica qual é a facility executada por este script Init (o nome deve ser único).\n\n - Required-start: \t\tespecifica o conjunto de facilities que deve ser iniciado antes de começar este serviço. \n \t\t\t\t\t\tExistem alguns nomes todos iniciados por $: $local_fs, $remote_fs, $network, $named, $portmap, $syslog, $time e $all.\n\n - Required-Stop: \t\tespecifica a lista de facilities que devem ser paradas depois de parar esta facility.\n\n - Default-Start:  \t\tdefinem os níveis de execução ex: 2 3 4 5 em que o serviço deve ser iniciado.\n \n - Default-Stop: \t\tdefinem os níveis de execução ex: 0 1 6 em que o serviço deve ser parado.\n\n - Short-Description: \tapresentam a descrição do serviço.\n\n - Description:\t\t\tapresentam a descrição do serviço.\n\nMais detalhes das funções de script confere aqui: [LSB Ini Script](http://refspecs.linuxbase.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptfunc.html)\n\n#### httphello.sh\n\n```sh\n#!/bin/bash\n# Exemplo de script para inicializar no boot do linux\n# Usando Systemctl \n# Este script tem que está em: /etc/init.d\n# \n# @package     httphello\n# @author      @jeffotoni\n# @size        05/2018\n\n### BEGIN INIT INFO\n# Provides:          httphello\n# Required-Start:    $remote_fs $syslog\n# Required-Stop:     $remote_fs $syslog\n# Default-Start:     2 3 4 5\n# Default-Stop:      0 1 6\n# Short-Description: Start daemon at boot time\n# Description:       Enable service provided by daemon.\n### END INIT INFO\n\necho \"#######################\"\necho \"    httphello     \"\necho \"#######################\"\n\n# Usando as funções lsb para executar as operações.\n. /lib/lsb/init-functions\n\n# Nome processo\nNAME=httphello\n\n# Nome do daemon onde irá executar\nDAEMON=/usr/bin/httphello\n\n# pid do arquivo para o daemon\nPIDFILE=/var/run/httphello.pid\n\n# Se o daemon não estiver lá, saia.\ntest -x $DAEMON || exit 5\n\n# funcao start\nd_start () \n{ \n\n    # Verificado o arquivo PID existe e verificar o status atual do processo\n    if [ -e $PIDFILE ]; then\n       status_of_proc -p $PIDFILE $DAEMON \"$NAME process\" \u0026\u0026 status=\"0\" || status=\"$?\"\n       \n       # Se o status for SUCESSO, não será necessário iniciar novamente.\n       if [ $status = \"0\" ]; then\n          exit # Exit\n       fi\n    fi\n    \n    # Start o daemon.\n    log_daemon_msg \"Starting the process\" \"$NAME\"\n\n    # Inicie o daemon com a ajuda de start-stop-daemon\n\t# Registre a mensagem apropriadamente\n    if start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON ; then\n       log_end_msg 0\n    else\n       log_end_msg 1\n    fi\n}\n\n# funcao stop\nd_stop ()  \n{ \n     # Verificado o arquivo PID existe\n     if [ -e $PIDFILE ]; then\n        status_of_proc -p $PIDFILE $DAEMON \"Stoppping the $NAME process\" \u0026\u0026 status=\"0\" || status=\"$?\"\n     if [ \"$status\" = 0 ]; then\n        start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE\n        /bin/rm -rf $PIDFILE\n     fi\n     else\n       log_daemon_msg \"$NAME process is not running\"\n       log_end_msg 0\n     fi\n }\n\n#funcao status\n d_status ()\n {\t\n \t# Verificado o arquivo PID existe\n    if [ -e $PIDFILE ]; then\n     status_of_proc -p $PIDFILE $DAEMON \"$NAME process\" \u0026\u0026 exit 0 || exit $?\n    else\n      log_daemon_msg \"$NAME Process is not running\"\n      log_end_msg 0\n    fi\n\n    #ps  -ef  |  grep httphello | grep  -v  grep\n    #echo  \"PID indicate indication file\" \n}\n\n# funcao restart\nd_restart ()\n{\n  # Restart o daemon.\n  $0 stop \u0026\u0026 sleep 2 \u0026\u0026 $0 start\n}\n\n# reload\nd_reload ()\n{\n    # Recarregue o processo. \n    # Basicamente enviando algum sinal \n    # para um daemon para recarregar\n\t# configurações.\n    if [ -e $PIDFILE ]; then\n      start-stop-daemon --stop --signal USR1 --quiet --pidfile $PIDFILE --name $NAME\n      log_success_msg \"$NAME process reloaded successfully\"\n    else\n      log_failure_msg \"$PIDFILE does not exists\"\n    fi\n}\n\n# Instruções de \n# gerenciamento \n# do serviço\ncase  \"$1\"  in \n        start)\n            d_start\n            ;; \n\n        stop)\n            d_stop\n            ;;\n\n        restart)\n            d_restart\n            ;;\n        reload)\n            d_reload\n            ;;\n        status)\n            d_status\n            ;;\n        *)\n        echo  \"Usage: $0 {start|stop|restart|reload|status}\"\n        exit 1 \n        ;; \nesac\n\n```\n\n#### Script httphello.service\n\nO arquivo deve ser colocado dentro de **/etc/systemd/system/** (preferencialmente) ou **/lib/systemd/system/** e ter a extensão **.service**, seu formato é:\n\n#### httphello.service\n\n```sh\n\n[Unit]\n# nome do servico\nDescription=httphello\n\n#Serviço \nAfter=multi-user.target\n\n[Service]\n\n# Se for apenas um processo \n# use Type simple; \n# caso ele gere subprocessos \n# use forking\nType=forking\n\n# Caso use forking, \n# convém guardar o número pid \n# do processo pai para o systemd \n# fazer o monitoramento\nPIDFile=/var/run/httphello.pid\n\n# inicia o processo aqui\n# (caso use forking) \nExecStart=/etc/init.d/httphello start\n\n# usuario\n# que irá\n# executar\nUser=root\n\n# diretorio \nWorkingDirectory=/etc/init.d\n\n#Restart=no\nRestart=always\n\n# tempo para\n# restart do \n# serviço\nRestartSec=1s\n\n# mantendo os logs no \n# syslog\nStandardOutput=syslog\n\n# logs de errros\nStandardError=inherit\n\n# Comando que para o serviço \n# (o próprio Systemd \n# se encarrega de acompanhar \n# o PID do serviço)\nExecStop=/bin/kill -TERM $MAINPID\n\n[Install]\n\n#Necessário para instalação do serviço\nWantedBy=multi-user.target\n\n```\nLogo após copia-lo habilite ele para que na inicialização possa executa-lo, use o comando abaixo:\n\n```sh\n\nsudo systemctl enable httphello.service\n\n```\n\n### Systemd (systemctl)\n\nÉ baseado na notação de sete tipos diferentes de unidades (ou units), cujo nome é composto de uma identificação e o seu tipo como sufixo (se não for especificado, o systemctl assumirá .service):\n\n - service: daemons que podem ser iniciados, parados, reiniciados e recarregados.\n\n- socket: encapsula um socket no sistema de arquivos ou na Internet; sockets são programas responsaveis pela comunicação ou interligação de outros programas que atuam na camada de transporte, como os “Stream Sockets” (usado no telnet) e os “Datagram Sockets” (usam UDP em vez de TCP).\n\n- device: encapsula um dispositivo na árvore de dispositivos do Linux; se é marcado através de regras no udev, ele será exposto a um dispositivo de unidade no systemd.\n\n- mount: encapsula um ponto de montagem na hierarquia do sistema de arquivos.\n\n- automount: encapsula um ponto de montagem automático na hierarquia do sistema de arquivos; cada unidade automount, tem uma unidade mount correspondente, que é iniciada(montada) assim que o diretório automount é acessado.\n\n- target: usada para agrupamento lógico de unidades, referenciando outras unidades que podem ser controladas então de forma conjunta (por exemplo, “multi-user.target” é uma unidade que basicamente equivale a regra do run-level 5 no clássico SysV).\n\n- snapshot: similar a unidade target, a unidade snapshot não faz nada por si so a não ser referenciar outras unidades.\n\n\n#### Daemon httphello\n\nNosso terceiro programa é o Daemon, será responsável por ficar escutando em uma porta 8080 e receberá uma solicitação POST como exemplo abaixo:\n\nO **httphello.go** é nosso Daemon, iremos compilar e disponibilizar como um serviço, toda vez que iniciarmos nosso sistema operacional ele será iniciado e mantido como serviço pelo Linux.\n\nO Go tem que está instalado em sua máquina caso contrário visite este link [golang download](https://golang.org/dl/)\n\nPara compilar nosso exemplo basta rodar o comando:\n\n```go\n\n$ go build -o httphello httphello.go\n\n$ sudo cp httphello /usr/bin\n\n```\n\n### Nosso Daemond em Go\n\n#### httphello.go\n\n```go\n\n// nossa funcao\n// principal\nfunc main() {\n\n\t// show msg\n\tfmt.Println(\"Iniciando Hello...\")\n\n\t// declarando nosso endpoint\n\thttp.HandleFunc(\"/hello\", Hello)\n\n\t// apresentando um log na saida caso\n\t// ocorra algo de errado\n\tlog.Fatal(http.ListenAndServe(\":\"+PORT, nil))\n}\n\n```\n\n### Um Client para testar nosso serviço\n\n```sh\n\n$ curl -vX POST \\\n\tlocalhost:9999/hello \\\n\t-d \"name=jefferson\"\n\n```\n\n```sh\n\n$ curl -vX GET \\\n\tlocalhost:9999/hello\n\n```\n\n### Crontab como Serviço de inicialização\n\nO serviço de agendamento de tarefas do Linux também pode ser usado para iniciar um script na inicialização. \n\nAtravés do comando “crontab -e” conseguiremos editar nosso crontab.\n\nToda vez que inicializarmos a máquina ele irá executar nossa Api que irá ser nosso Daemon.\n\n```sh\n\n@reboot /usr/bin/httphello \u003e /tmp/httphello.log 2\u003e\u00261\n\n```\n\nNeste cenário usando crontab podemos criar um script para fazer o start e stop de nosso Daemon, ao invés de chama-lo diretamente como fizemos acima.\n\nNosso crontab então ficaria assim:\n\n```sh\n\n@reboot /etc/init.d/cron-httphello.sh start\n\n```\n\nFizemos algumas modificações em nosso script a principal delas é que não iremos utilizar as funções lsb para executar as operações. **. /lib/lsb/init-functions** removemos.\n\nNossas funções de start, stop e status foram todas modificadas, conforme o código abaixo:\n\n\n```sh\n\n#!/bin/bash\n# @autor jeff.otoni@gmail.com\n# @date  05/2018\n# Script Exemplo para iniciar nosso Daemon\n\necho \"#######################\"\necho \"    cron-httphello     \"\necho \"#######################\"\n\n# Process name ( For display )\nNAME=httphello\n\n# Daemon name, where is the actual executable\nDAEMON=/usr/bin/httphello\n# pid file for the daemon\nPIDFILE=/var/run/httphello.pid\n\n# If the daemon is not there, then exit.\ntest -x $DAEMON || exit 5\n\n# start\nd_start () \n{ \n\n    echo  \"cron-httphello: starting service\" \n    cd /usr/bin\n    httphello \u003e /tmp/cron-httphello.log \u0026\n    sleep  1\n    echo \"Executando cron-httphello sucesso\"\n}\n\n# stop\nd_stop ()  \n{ \n    echo  \"httphello: stopping Service (PID=$(ps aux | grep httphello | awk '{print $2}'))\"\n    killall -9 httphello\n }\n\n# status\nd_status ()\n {\n    ps  -ef  |  grep httphello | grep  -v  grep\n    #echo  \"PID indicate indication file\" \n}\n\n# restart\nd_restart ()\n{\n  # Restart the daemon.\n  $0 stop \u0026\u0026 sleep 2 \u0026\u0026 $0 start\n}\n\n# Management instructions of the service \ncase  \"$1\"  in \n        start)\n            d_start\n            ;; \n\n        stop)\n            d_stop\n            ;;\n\n        restart)\n            d_restart\n            ;;\n        status)\n            d_status\n            ;;\n            \n        *)\n        echo  \"Usage: $0 {start|stop|restart|status}\" \n        exit 1 \n        ;; \nesac\n\n```\n\n## Como ficou os passos no padrão Lsb\n\nUsando o padrão Lsb para rodarmos com systemctl foi desenvolvido um script para rodar com as funções lsb para executar as operações nativas do systemctl com a lib **. /lib/lsb/init-functions**, ou seja:\n\n - Copiamos nosso script httphello.sh para **/etc/init.d/**\n \n - Copiamos nosso script **httphello.service** para **/etc/systemd/system** (preferencialmente) ou **/lib/systemd/system/**\n\n - Copiamos nosso Daemon compilado **httphello** para **/usr/bin**\n\n - Habilitando nosso serviço usando **sudo systemctl enable httphello.service**\n\nE agora é inicializar a máquina e conferir se o serviço está rodando.\n\nConferindo o serviço:\n\n```sh\n\n$ sudo systemctl status httphello\n\n$ sudo systemctl is-active httphello\n\n$ sudo systemctl is-enabled httphello\n\n```\n\nCaso desejar parar o serviço e inicializa-lo podemos usar:\n\n```sh\n\n$ sudo systemctl stop httphello\n\n$ sudo systemctl start httphello\n\n```\n\nUma outra forma de visualizar o processo rodando é o noss velho e amigo **ps**\n\n```sh\n\n$ ps aux | grep httphello\n\n```\n\n## Como ficou os passos utilizando crontab\n\nUsando o crontab não tem muito segredo não, iremos editar nosso arquivo crontab com o comando **crontab -e** e adicionar a linha do nosso script.\n\n```sh\n\n@reboot /etc/init.d/cron-httphello.sh start\n\n```\n\n - Copiamos nosso script cron-httphello.sh para **/etc/init.d/**\n\n - Copiamos nosso Daemon compilado **httphello** para **/usr/bin**\n\nE agora é inicializar a máquina e conferir se o serviço está rodando.\n\nConferindo o serviço:\n\n```sh\n\n$ sh /etc/init.d/cron-httphello.sh status\n\n```\n\nParando o serviço:\n\n```sh\n\n$ sh /etc/init.d/cron-httphello.sh stop\n\n```\n\nIniciando o serviço:\n\n```sh\n\n$ sh /etc/init.d/cron-httphello.sh start\n\n```\n\n### Cuidado quando usar Crontab\n\nA desvantagem deste cenário é que seu Daemon usar algum serviço como o redis, postgresql, apache, nginx etc, seu script será executando antes de todos eles a ordem de execução será do crontab, ou seja você não tem controle sobre a ordem de inicialização do seu Daemon, o crontab irá executar antes dos serviços.\n\nVocê teria que criar um sleep em sua Daemon para aguardar um pouco antes de tentar iniciar o serviço para dar tempo os outros subirem, para alguns cenários isto não fica muito elegante o ideal é usar o padrão Lsb como descrevemos acima.\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeffotoni%2Fsystemctl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjeffotoni%2Fsystemctl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeffotoni%2Fsystemctl/lists"}