{"id":1995,"date":"2023-12-05T11:20:15","date_gmt":"2023-12-05T10:20:15","guid":{"rendered":"https:\/\/alessandromasciadri.com\/?p=1995"},"modified":"2023-12-05T11:28:15","modified_gmt":"2023-12-05T10:28:15","slug":"come-eseguire-un-cronjob-ogni-30-secondi-su-linux","status":"publish","type":"post","link":"https:\/\/alessandromasciadri.com\/come-eseguire-un-cronjob-ogni-30-secondi-su-linux\/","title":{"rendered":"Come eseguire un cronjob ogni 30 secondi su Linux"},"content":{"rendered":"\t\t<div data-akihiro-type=\"ama-post\" data-akihiro-id=\"1995\" class=\"akihiro akihiro-1995\" data-akihiro-post-type=\"post\">\n\t\t\t\t<div class=\"akihiro-element akihiro-element-a26a386 e-flex e-con-boxed e-con e-parent\" data-id=\"a26a386\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"akihiro-element akihiro-element-a38dbbd akihiro-widget akihiro-widget-text-editor\" data-id=\"a38dbbd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Di default, il cron job scheduler di Linux non supporta la definizione di uno scheduling per secondi. Infatti l&#8217;unit\u00e0 minima specificabile in cron \u00e8 1 minuto. Tuttavia, \u00e8 possibile applicare alcuni semplici workaround per avere i propri task con uno scheduling impostato in secondi.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-266d053 akihiro-widget akihiro-widget-heading\" data-id=\"266d053\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t<h3 class=\"akihiro-heading-title akihiro-size-default\">Sintassi di crontab<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-bd8ba71 akihiro-widget akihiro-widget-text-editor\" data-id=\"bd8ba71\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Sintatticamente un cronjob \u00e8 definito nel seguente modo<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-b3140a3 akihiro-widget akihiro-widget-code-highlight\" data-id=\"b3140a3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash \">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>A B C D E USERNAME \/path\/to\/command<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-2707776 akihiro-widget akihiro-widget-text-editor\" data-id=\"2707776\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li>A \u2192 minuti<\/li><li>B \u2192 ore<\/li><li>C \u2192giorni<\/li><li>D \u2192mesi<\/li><li>E \u2192giorni della settimana<\/li><\/ul><p>\u00a0<\/p><p><code>USERNAME<\/code> \u00e8 lo user con il quale invocare il comando<\/p><p><code>\/path\/to\/command<\/code> \u00e8 il path completo al comando oggetto di scheduling<\/p><p>Addizionalmente possono essere utilizzati i seguenti operatori:<\/p><p>(,) \u2192 specifica di una lista di valori<br \/>\u2013 \u2192 specifica di un range di valori<br \/>\/ \u2192 definizione di uno step value<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-9e760e6 akihiro-widget akihiro-widget-text-editor\" data-id=\"9e760e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Per esempio, il seguente definisce un cronjob che viene lanciato ogni secondo giorno del mese alle 4:30 PM<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-f950c4c akihiro-widget akihiro-widget-code-highlight\" data-id=\"f950c4c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash \">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>30 16 2 * * \/path\/to\/script.sh<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-2a34dcd akihiro-widget akihiro-widget-text-editor\" data-id=\"2a34dcd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Vediamo ora come schedulare un cronjob per essere eseguito ogni 30 secondi.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-11193ff akihiro-widget akihiro-widget-heading\" data-id=\"11193ff\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t<h3 class=\"akihiro-heading-title akihiro-size-default\">Come eseguire un cronjob ogni 30 secondi<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-c9b4643 akihiro-widget akihiro-widget-text-editor\" data-id=\"c9b4643\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Sostanzialmente, quello che faremo \u00e8 creare due entries in crontab. Con la prima definiamo un job che esegue il comando ogni minuto, mentre la seconda entry eseguir\u00e0 prima il comando di sleep per aggiungere un delay di 30 secondi e successivamente invocare lo stesso comando della prima entry. Vediamo ora come realizzarlo.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-56e8010 akihiro-widget akihiro-widget-heading\" data-id=\"56e8010\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t<h5 class=\"akihiro-heading-title akihiro-size-default\">Aprire crontab<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-1e46d0b akihiro-widget akihiro-widget-text-editor\" data-id=\"1e46d0b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Apriamo il terminale e lanciamo il seguente comando per aprire crontab:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-f529492 akihiro-widget akihiro-widget-code-highlight\" data-id=\"f529492\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash \">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>crontab -e<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-a2cd605 akihiro-widget akihiro-widget-heading\" data-id=\"a2cd605\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t<h5 class=\"akihiro-heading-title akihiro-size-default\">Aprire crontab<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-fd5c5ad akihiro-widget akihiro-widget-text-editor\" data-id=\"fd5c5ad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Aggiungiamo le seguenti righe nella nostra crontab:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-e51c686 akihiro-widget akihiro-widget-code-highlight\" data-id=\"e51c686\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash \">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>* * * * * \/usr\/bin\/date >> \/tmp\/date.log\n* * * * * sleep 30; \/usr\/bin\/date >> \/tmp\/date.log<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-a21f3e3 akihiro-widget akihiro-widget-text-editor\" data-id=\"a21f3e3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Nel nostro esempio utilizziamo il comando date. Sostituirlo con il comando desiderato per adattarlo ad ogni necessit\u00e0.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-ba6d27e akihiro-widget akihiro-widget-heading\" data-id=\"ba6d27e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t<h5 class=\"akihiro-heading-title akihiro-size-default\">Verificare l'esecuzione corretta dello scheduling<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-454d7b3 akihiro-widget akihiro-widget-text-editor\" data-id=\"454d7b3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Lanciamo quindi il seguente comando per verificare il corretto funzionamento del nostro scheduling:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-8ac6b15 akihiro-widget akihiro-widget-code-highlight\" data-id=\"8ac6b15\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash \">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>tail -f  \/tmp\/date.log<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-284afe5 akihiro-widget akihiro-widget-text-editor\" data-id=\"284afe5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Noteremo che ogni 30 secondi viene aggiunta una riga al nostro file di log e questo conferma l&#8217;efficacia del workaround che abbiamo applicato.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-85257ad akihiro-widget akihiro-widget-heading\" data-id=\"85257ad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t<h3 class=\"akihiro-heading-title akihiro-size-default\">Come eseguire un cronjob ogni 10 secondi<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-ae9622c akihiro-widget akihiro-widget-text-editor\" data-id=\"ae9622c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Secondo la logica definita qui sopra, possiamo estendere il nostro workaround per far eseguire a crontab un task ogni 10 secondi. In questo caso la nostra crontab dovr\u00e0 essere popolata nel seguente modo:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-dea8f30 akihiro-widget akihiro-widget-code-highlight\" data-id=\"dea8f30\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash \">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>* * * * * \/usr\/bin\/date >> \/tmp\/date.log\n* * * * * sleep 10; \/usr\/bin\/date >> \/tmp\/date.log\n* * * * * sleep 20; \/usr\/bin\/date >> \/tmp\/date.log\n* * * * * sleep 30; \/usr\/bin\/date >> \/tmp\/date.log\n* * * * * sleep 40; \/usr\/bin\/date >> \/tmp\/date.log\n* * * * * sleep 50; \/usr\/bin\/date >> \/tmp\/date.log<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Di default, il cron job scheduler di Linux non supporta la definizione di uno scheduling per secondi. Infatti l&#8217;unit\u00e0 minima specificabile in cron \u00e8 1 minuto. Tuttavia, \u00e8 possibile applicare alcuni semplici workaround per avere i propri task con uno scheduling impostato in secondi. Sintassi di crontab Sintatticamente un cronjob \u00e8 definito nel seguente modo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[20,19],"class_list":["post-1995","post","type-post","status-publish","format-standard","hentry","category-sistemistica","tag-linux","tag-ubuntu"],"_links":{"self":[{"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/posts\/1995","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/comments?post=1995"}],"version-history":[{"count":4,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/posts\/1995\/revisions"}],"predecessor-version":[{"id":1999,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/posts\/1995\/revisions\/1999"}],"wp:attachment":[{"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/media?parent=1995"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/categories?post=1995"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/tags?post=1995"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}