<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Renato Assis</title>
    <description>The latest articles on Forem by Renato Assis (@renatoassis01).</description>
    <link>https://forem.com/renatoassis01</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4512%2Fa8317028-0faa-4606-a169-8eaa15971e30.png</url>
      <title>Forem: Renato Assis</title>
      <link>https://forem.com/renatoassis01</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/renatoassis01"/>
    <language>en</language>
    <item>
      <title>Como agendar execução de consultas e comandos pelo PostgreSQL no RDS</title>
      <dc:creator>Renato Assis</dc:creator>
      <pubDate>Mon, 07 Feb 2022 13:46:36 +0000</pubDate>
      <link>https://forem.com/renatoassis01/como-agendar-execucao-de-consultas-e-comandos-pelo-postgresql-no-rds-4b1c</link>
      <guid>https://forem.com/renatoassis01/como-agendar-execucao-de-consultas-e-comandos-pelo-postgresql-no-rds-4b1c</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;PostgreSQL é um banco de dados incrível e que tem crescido nos últimos anos. Possui uma arquitetura modular e de fácil extensibilidade, existem no mercado diversos produtos baseado nele. Um dos recursos mais legais do Postgres são suas extensões. Essas extensões dão a possibilidade ao usuário de estender suas funcionalidades através da instalação de módulos adicionais. Neste artigo abordaremos a utilização da extensão &lt;code&gt;pg_cron&lt;/code&gt; disponível no &lt;a href="https://aws.amazon.com/pt/rds/postgresql/" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;aws rds&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;. O RDS é um serviço de banco de dados gerenciado da Amazon Web Services. &lt;/p&gt;

&lt;h2&gt;
  
  
  Extensão pg_cron
&lt;/h2&gt;

&lt;p&gt;A extensão &lt;code&gt;pg_cron&lt;/code&gt; é um agendador de tarefas simples baseado no cron para PostgreSQL(10 ou superior) que é executado dentro do banco de dados como uma extensão. Ele usa a mesma sintaxe do &lt;a href="https://en.wikipedia.org/wiki/Cron" rel="noopener noreferrer"&gt;cron&lt;/a&gt; comum, mas permite agendar comandos do PostgreSQL diretamente. A extensão foi desenvolvida pela  &lt;strong&gt;Citus Data&lt;/strong&gt;(comprada pela Microsoft). Para mais detalhes veja no link &lt;a href="https://github.com/citusdata/pg_cron" rel="noopener noreferrer"&gt;https://github.com/citusdata/pg_cron&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Habilitando a extensão no RDS
&lt;/h2&gt;

&lt;p&gt;Neste artigo consideraremos a versão 13 do Postgres. Para habilitar a extensão, primeiramente precisaremos criar um &lt;strong&gt;&lt;em&gt;Parameter group&lt;/em&gt;&lt;/strong&gt;. No console da AWS vá em RDS no menu do lado esquerdo clique em &lt;strong&gt;&lt;em&gt;Parameter group&lt;/em&gt;&lt;/strong&gt;, conforme imagem abaixo: &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fek02p80ol3cfdnt89ci9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fek02p80ol3cfdnt89ci9.png" alt="Menu de Opções do RDS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em seguida clique em "&lt;strong&gt;&lt;em&gt;create parameter group&lt;/em&gt;&lt;/strong&gt;" no canto superior direito, veja a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdzsefoqqybmyx2pgpj8i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdzsefoqqybmyx2pgpj8i.png" alt="Listagem do Parameter groups"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em &lt;strong&gt;&lt;em&gt;Parameter group family&lt;/em&gt;&lt;/strong&gt;, selecione "postgres 13", em &lt;strong&gt;&lt;em&gt;Type&lt;/em&gt;&lt;/strong&gt; deixe o valor como está(DB Parameter Group), no campo &lt;strong&gt;&lt;em&gt;Group name&lt;/em&gt;&lt;/strong&gt; coloque um identificador apropriado, em &lt;strong&gt;&lt;em&gt;Description&lt;/em&gt;&lt;/strong&gt; coloque um valor apropriado e clique no botão "&lt;strong&gt;&lt;em&gt;create&lt;/em&gt;&lt;/strong&gt;", conforme a imagem abaixo: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrhdw7yv4gzfej6x0z0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrhdw7yv4gzfej6x0z0d.png" alt="Create parameter group"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na listagem dos &lt;strong&gt;&lt;em&gt;Parameters Group&lt;/em&gt;&lt;/strong&gt; procure o parameter group definido no passo anterior, conforme a imagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foydirg1gc5ddq8t661m0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foydirg1gc5ddq8t661m0.png" alt="Listagem do Parameter groups"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na caixa de busca pesquise por "shared", conforme a imagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7d7mi66cizxsi8bv5855.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7d7mi66cizxsi8bv5855.png" alt="Listagem dos parâmetros do parameter group criado"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em seguida selecione o parâmetro &lt;code&gt;shared_preload_libraries&lt;/code&gt; e clique no botão superior direito "&lt;strong&gt;&lt;em&gt;Edit parameter&lt;/em&gt;&lt;/strong&gt;", conforme imagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2j2lvruvssv5l78xb68c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2j2lvruvssv5l78xb68c.png" alt="Listagem dos parâmetros do parameter group criado"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Coloque separado por vírgula a extensão &lt;code&gt;pg_cron&lt;/code&gt; e clique em "&lt;strong&gt;&lt;em&gt;Save Changes&lt;/em&gt;&lt;/strong&gt;", conforme a imagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5og0owr96h4fxbs1ywtf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5og0owr96h4fxbs1ywtf.png" alt="Edição dos parâmetros do parameter group criado"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;shared_preload_libraries: pg_stat_statements,pg_cron&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Habilitando a extensão em uma instância
&lt;/h2&gt;

&lt;p&gt;Você pode habilitar a extensão em dois momentos, no momento da criação de uma instância ou em uma já criada. Neste artigo vou mostrar como habilitar em uma instância já criada.&lt;/p&gt;

&lt;p&gt;No menu do RDS clique em "Databases"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcazrd3353pab7wktmb6j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcazrd3353pab7wktmb6j.png" alt="Menu do RDS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selecione a instância desejada e clique em "&lt;strong&gt;&lt;em&gt;Modify&lt;/em&gt;&lt;/strong&gt;", conforme a imagem a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiiryt5iegud67uqhzx8s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiiryt5iegud67uqhzx8s.png" alt="Listagem de Instância"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Navegue até a opção, &lt;strong&gt;&lt;em&gt;Additional configuration&lt;/em&gt;&lt;/strong&gt; &amp;gt; &lt;strong&gt;&lt;em&gt;Database options&lt;/em&gt;&lt;/strong&gt; &amp;gt; &lt;strong&gt;&lt;em&gt;DB parameter group&lt;/em&gt;&lt;/strong&gt; selecione o &lt;code&gt;parameter group&lt;/code&gt; criado nos passos anteriores e em seguida salve a modificação&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dsy1nfhr14006575ea6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dsy1nfhr14006575ea6.png" alt="Additional configuration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feito isso reinicie a instância.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxm6f33kp236pxvx4isyy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxm6f33kp236pxvx4isyy.png" alt="Listagem de Instância"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto!!!! Agora precisamos habilitar a extensão dentro da instância do PostgreSQL.&lt;/p&gt;
&lt;h2&gt;
  
  
  Habilitando a extensão no PostgreSQL
&lt;/h2&gt;

&lt;p&gt;Os metadados para pg_cron são todos mantidos no banco de dados padrão PostgreSQL chamado &lt;code&gt;postgres&lt;/code&gt;. Você pode agendar um trabalho em qualquer um dos seus bancos de dados dentro da instância de banco de dados do PostgreSQL. &lt;/p&gt;

&lt;p&gt;Conecte no banco padrão chamado &lt;code&gt;postgres&lt;/code&gt; e habilite a extensão &lt;code&gt;pg_cron&lt;/code&gt; com o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;EXTENSION&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;pg_cron&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso você terá acesso as funções e objetos do &lt;code&gt;pg_cron&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Realizando agendamentos com a pg_cron
&lt;/h2&gt;

&lt;p&gt;Para agendar um comando existem duas opções:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. Usando a função &lt;code&gt;cron.schedule&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'0 0 * * *'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; 
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;logs&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;end_time&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="err"&gt;–&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt; &lt;span class="s1"&gt;'7 days'&lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso você deve alterar o banco de dados com um update, pelo fato que o default é o banco padrão &lt;code&gt;postgres&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Você pode usar o &lt;a href="https://crontab.guru/" rel="noopener noreferrer"&gt;https://crontab.guru/&lt;/a&gt; para auxiliar na sintaxe do cron&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'database1'&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;jobid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. Fazendo um insert direto na tabela &lt;code&gt;cron.job&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nodename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nodeport&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;database&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;jobname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'0 0 * * *'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; 
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;logs&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;end_time&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="err"&gt;–&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt; &lt;span class="s1"&gt;'7 days'&lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'localhost'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'database1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'postgres'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'clear-log
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Você só pode agendar para banco de dados somente dentro da instância, então valor da coluna &lt;code&gt;nodename&lt;/code&gt; deve ser sempre &lt;code&gt;localhost&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para consultar a execução dos agendamentos use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;job_run_details&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para remover um agendamento use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;jobname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'clear-log'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unschedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lembre-se que sempre que precisar realizar manutenção ou verificar o status dos agendamento vocẽ deve sempre conectar no banco padrão &lt;code&gt;postgres&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;Para configurações adicionais consulte a documentação oficial:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/AmazonRDS/latest/UserGuide/PostgreSQL_pg_cron.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/pt_br/AmazonRDS/latest/UserGuide/PostgreSQL_pg_cron.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para detalhes adicionais da extensão:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/citusdata/pg_cron" rel="noopener noreferrer"&gt;https://github.com/citusdata/pg_cron&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Extras
&lt;/h2&gt;

&lt;p&gt;Caso queira testar a extensão &lt;code&gt;pg_cron&lt;/code&gt; localmente, você pode usar esse &lt;code&gt;dockerfile&lt;/code&gt; de exemplo &lt;a href="https://github.com/renatoassis01/docker-pg-cron" rel="noopener noreferrer"&gt;https://github.com/renatoassis01/docker-pg-cron&lt;/a&gt;&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>rds</category>
      <category>aws</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Opções do Bash</title>
      <dc:creator>Renato Assis</dc:creator>
      <pubDate>Mon, 30 Sep 2019 16:58:46 +0000</pubDate>
      <link>https://forem.com/renatoassis01/opcoes-do-bash-40e9</link>
      <guid>https://forem.com/renatoassis01/opcoes-do-bash-40e9</guid>
      <description>&lt;p&gt;Escrever shell script para realizar tarefas rotineiras de desenvolvimento pode ser muito útil, porém as vezes nos deparamos com alguns comportamentos inesperados do bash. Neste artigo você aprenderá algumas opções que alteram o comportamento do shell e ou do script e evitam efeitos indesejáveis e que são muito úteis. &lt;strong&gt;&lt;em&gt;Use com moderação!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aqui vai algumas dessas opções:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abreviação&lt;/th&gt;
&lt;th&gt;Nome&lt;/th&gt;
&lt;th&gt;Efeito&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-e&lt;/td&gt;
&lt;td&gt;errexit&lt;/td&gt;
&lt;td&gt;Abortar script no primeiro erro, quando um comando sair com status diferente de zero (exceto em for ou while loops, if-tests, list constructs )&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-x&lt;/td&gt;
&lt;td&gt;xtrace&lt;/td&gt;
&lt;td&gt;Semelhante a -v, mas expande os comandos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-v&lt;/td&gt;
&lt;td&gt;verbose&lt;/td&gt;
&lt;td&gt;Imprima cada comando para stdout antes de executá-lo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-u&lt;/td&gt;
&lt;td&gt;nounset&lt;/td&gt;
&lt;td&gt;Verifica variáveis ​​indefinidas e força a saída&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-o pipefail&lt;/td&gt;
&lt;td&gt;-o pipefail&lt;/td&gt;
&lt;td&gt;Faz com que um pipeline retorne o status de saída do último comando que retornou um valor de retorno diferente de zero.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Para mais detalhes consulte &lt;a href="http://www.tldp.org/LDP/abs/html/options.html"&gt;Tabela 33-1. Opções do bash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para usar essas opções dentro do script, use o comando &lt;code&gt;set&lt;/code&gt; nas seguintes formas: &lt;strong&gt;set -o nome-da-opção&lt;/strong&gt; ou, na forma abreviada, &lt;strong&gt;set -opção-abrev&lt;/strong&gt;. Essas duas maneiras são equivalentes.&lt;/p&gt;

&lt;p&gt;Exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; 
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;...
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; verbose 
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Para desabilitar uma opção dentro de um script, use &lt;strong&gt;set +o nome-da-opção&lt;/strong&gt; ou &lt;strong&gt;set +opção-abrev&lt;/strong&gt; .&lt;/p&gt;

&lt;p&gt;Exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;...
&lt;span class="nb"&gt;set&lt;/span&gt; +o verbose
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;...
&lt;span class="nb"&gt;set&lt;/span&gt; +v
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  opção -e(errexit)
&lt;/h1&gt;

&lt;p&gt;Essa opção encerra a execução do script no primeiro erro encontrado.&lt;/p&gt;

&lt;p&gt;Considere o conteúdo do arquivo &lt;code&gt;script.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#! /bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;logs.txt
&lt;span class="nb"&gt;mkdir &lt;/span&gt;p
file p
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ao executar o script note que o arquivo &lt;code&gt;logs.txt&lt;/code&gt; não existe, porém mkdir é executado&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ./script.sh  
cat: logs.txt: No such file or directory
p: directory

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Adicionando a opção &lt;code&gt;set -e&lt;/code&gt; no arquivo &lt;code&gt;script.sh&lt;/code&gt; garantirá que ao primeiro erro a execução seja abortada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;logs.txt
&lt;span class="nb"&gt;mkdir &lt;/span&gt;p
file p   
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;./script.sh  
&lt;span class="nb"&gt;cat&lt;/span&gt;: logs.txt: No such file or directory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Observe que o comando mkdir não é processado&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  opção -x(xtrace)
&lt;/h1&gt;

&lt;p&gt;Considerando o arquivo &lt;code&gt;script.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;x &lt;span class="k"&gt;in &lt;/span&gt;1 2 3 4 5
&lt;span class="k"&gt;do
   &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$x&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'olá'&lt;/span&gt; 
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; g
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Sua saída será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;./script.sh
+ &lt;span class="k"&gt;for &lt;/span&gt;x &lt;span class="k"&gt;in &lt;/span&gt;1 2 3 4 5
+ &lt;span class="nb"&gt;echo &lt;/span&gt;1
1
+ &lt;span class="k"&gt;for &lt;/span&gt;x &lt;span class="k"&gt;in &lt;/span&gt;1 2 3 4 5
+ &lt;span class="nb"&gt;echo &lt;/span&gt;2
2
+ &lt;span class="k"&gt;for &lt;/span&gt;x &lt;span class="k"&gt;in &lt;/span&gt;1 2 3 4 5
+ &lt;span class="nb"&gt;echo &lt;/span&gt;3
3
+ &lt;span class="k"&gt;for &lt;/span&gt;x &lt;span class="k"&gt;in &lt;/span&gt;1 2 3 4 5
+ &lt;span class="nb"&gt;echo &lt;/span&gt;4
4
+ &lt;span class="k"&gt;for &lt;/span&gt;x &lt;span class="k"&gt;in &lt;/span&gt;1 2 3 4 5
+ &lt;span class="nb"&gt;echo &lt;/span&gt;5
5
+ &lt;span class="nb"&gt;echo &lt;/span&gt;olá
olá
+ &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; g
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  opção -v(verbose)
&lt;/h1&gt;

&lt;p&gt;Em comparação com flag &lt;code&gt;set -v&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;./script.sh   
&lt;span class="k"&gt;for &lt;/span&gt;x &lt;span class="k"&gt;in &lt;/span&gt;1 2 3 4 5
&lt;span class="k"&gt;do
   &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$x&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done
&lt;/span&gt;1
2
3
4
5
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'olá'&lt;/span&gt; 
olá
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; g
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;A diferença de &lt;code&gt;x&lt;/code&gt; para a opção &lt;code&gt;v&lt;/code&gt; é que na opção &lt;code&gt;x&lt;/code&gt; é mostrada a execução passo à passo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  opção -u(nounset)
&lt;/h1&gt;

&lt;p&gt;Considerando o arquivo &lt;code&gt;script.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;  &lt;span class="nt"&gt;-e&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"world"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;./script.sh   
world

hello
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note que variável &lt;code&gt;$a&lt;/code&gt; não existe, mas o script foi executado mesmo com a opção &lt;code&gt;set -e&lt;/code&gt; habilitada. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com a opção &lt;code&gt;set -eu&lt;/code&gt; o comportamento é totalmente diferente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;
/script.sh   
world
./script.sh: line 5: a: unbound variable

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;O bash não executará, pois com a opção &lt;code&gt;-u&lt;/code&gt; habilitada ele verifica se todas as variáveis tem algum valor atribuído.&lt;/p&gt;

&lt;h1&gt;
  
  
  opção -o(pipefail)
&lt;/h1&gt;

&lt;p&gt;Normalmente, o bash apenas consulta o último código de saída de um comando no pipeline de execução. Esse comportamento não é ideal, pois faz com que a opção &lt;code&gt;-e&lt;/code&gt; só considere a saída do último comando executado.É aqui que o &lt;code&gt;-o pipefail&lt;/code&gt; entra. Essa opção define que o bash verifique o código de saída do comando mais à direita.&lt;/p&gt;

&lt;p&gt;Confuso?&lt;/p&gt;

&lt;p&gt;Vamos novamente com o script &lt;code&gt;script.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;  &lt;span class="nt"&gt;-e&lt;/span&gt; 
bar | &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"O mundo é um redemoinho"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"world"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;./script.sh   
./script.sh: line 3: bar: &lt;span class="nb"&gt;command &lt;/span&gt;not found
O mundo é um redemoinho
world
hello
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;As seguinte linhas foram executadas mesmo com a opção &lt;code&gt;set -e&lt;/code&gt; definida. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso acontece porque a opção &lt;code&gt;set -e&lt;/code&gt; só verifica o último status, no caso &lt;code&gt;echo "O mundo é um redemoinho"&lt;/code&gt; e como ele foi executado corretamente.&lt;/p&gt;

&lt;p&gt;Para alterar esse comportamento é só definir &lt;code&gt;set -o pipefail&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Veja que a sintaxe dessa opção deve ser seguida da opção -o&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;  &lt;span class="nt"&gt;-eo&lt;/span&gt; pipefail
bar | &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"O mundo é um redemoinho"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"world"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;
./script.sh: line 3: bar: &lt;span class="nb"&gt;command &lt;/span&gt;not found

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use sempre &lt;code&gt;set -o pipefail&lt;/code&gt; em conjunto com as outras opções.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Habilitando essas opções em seus scripts, você vai evitar muitos comportamentos inesperados, lembre-se seja cauteloso com o uso dessas opções.&lt;/p&gt;

</description>
      <category>bash</category>
      <category>shellscript</category>
      <category>portuguese</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
