{"id":848,"date":"2005-08-27T22:30:00","date_gmt":"2005-08-28T05:30:00","guid":{"rendered":"http:\/\/kodegeek.com\/blog\/?p=848"},"modified":"2005-08-27T22:30:00","modified_gmt":"2005-08-28T05:30:00","slug":"echando-codigo-%c2%bfejecucion-de-programas-de-linea-de-comandos-mas-inteligente","status":"publish","type":"post","link":"http:\/\/kodegeek.com\/blog\/2005\/08\/27\/echando-codigo-%c2%bfejecucion-de-programas-de-linea-de-comandos-mas-inteligente\/","title":{"rendered":"Echando c\u00f3digo: \u00bfEjecuci\u00f3n de programas de linea de comandos m\u00e1s inteligente?"},"content":{"rendered":"<p><img decoding=\"async\" src=\"http:\/\/photos23.flickr.com\/34053239_03b6c1ade7_o.gif\" border=\"0\" \/><\/p>\n<p>Vamos a ver el siguiente problema: Usted rutinariamente ejecuta cierto programa en su sistema, el cual corre por una cantidad ilimitada de tiempo (como un demonio en UNIX); Rato m\u00e1s tarde se decide a matar el proceso y debe entonces empezar a buscar en que m\u00e1quina lo corrio y cual es el PID (program ID) de el proceso, para luego matarlo con kill. \u00bfSuena ladilla verdad? (sobre todo si lo hace todos los dias).<\/p>\n<p>Seria genial tener un programa que nos permita ejecutar un comando (sin importar en donde estemos parados en el sistema de archivos) y si necesitamos matarlo entonces s\u00f3lo llamamos a otro script con el nombre de el programa anterior. La idea es mantener el rastro de el primer programa (donde se ejecut\u00f3 y el PID) y para matarlo poder utilizar esa informaci\u00f3n. En el caso de demonios normalmente ejecutamos una instancia (y es esa la que tiene hijos), as\u00ed que nuestra soluci\u00f3n se va a valer de eso.<\/p>\n<p>La soluci\u00f3n a el problema se reduce a dos scripts:<\/p>\n<ul>\n<li>Uno para correr los programas, este mantendr\u00e1 la m\u00e1quina en donde lo ejecutamos y el PID de el programa que queremos correr.<\/li>\n<li>Un script que sabe que hizo el script que lanz\u00f3 el programa anterior, y con esa informaci\u00f3n lo mata<\/li>\n<\/ul>\n<p> Esto se puede hacer en cualquier script languaje, pero veamos que tan lejos podemos llegar con Perl \ud83d\ude42<\/p>\n<p>Supongamos que nuestro &#8220;<span style=\"font-style: italic;\">demonio<\/span>&#8221; es solamente un programita que no hace nada, excepto contar:<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax2\">#!<\/span><span class=\"syntax2\">\/bin\/bash<\/span><br \/><span class=\"gutter\">   2:<\/span>declare -ri <span class=\"syntax9\">MAX<\/span>=<span class=\"syntax5\">999999<\/span><br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax8\">for<\/span> ((<span class=\"syntax9\">i<\/span>=0; i <span class=\"syntax18\">&lt;<\/span>= MAX; i++))<br \/><span class=\"gutter\">   4:<\/span><span class=\"syntax8\">do<\/span><br \/><span class=\"gutterH\">   5:<\/span>        printf <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Counter<\/span><span class=\"syntax13\">:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">%<\/span><span class=\"syntax13\">i\\n<\/span><span class=\"syntax13\">\"<\/span> <span class=\"syntax9\">$<\/span><span class=\"syntax9\">i<\/span><br \/><span class=\"gutter\">   6:<\/span>        sleep <span class=\"syntax5\">10<\/span><br \/><span class=\"gutter\">   7:<\/span><span class=\"syntax8\">done<\/span><br \/><\/pre>\n<p>El programa que lo arranca:<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\">!\/usr\/bin\/perl<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">-w<\/span><br \/><span class=\"gutter\">   2:<\/span><br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax8\">use<\/span> strict;<br \/><span class=\"gutter\">   4:<\/span><span class=\"syntax8\">use<\/span> File<span class=\"syntax18\">:<\/span><span class=\"syntax18\">:<\/span>Basename;<br \/><span class=\"gutterH\">   5:<\/span><span class=\"syntax8\">use<\/span> Sys<span class=\"syntax18\">:<\/span><span class=\"syntax18\">:<\/span>Hostname;<br \/><span class=\"gutter\">   6:<\/span><br \/><span class=\"gutter\">   7:<\/span><span class=\"syntax8\">if<\/span> (<span class=\"syntax10\">scalar<\/span>(<span class=\"syntax9\">@ARGV<\/span>) <span class=\"syntax18\">&lt;=<\/span> <span class=\"syntax5\">0<\/span>) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">   8:<\/span>        <span class=\"syntax8\">die<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Provide<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">the<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">full<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">path<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">of<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">the<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">program<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">to<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">be<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">executed<\/span><span class=\"syntax13\">!<\/span><span class=\"syntax13\">\"<\/span>;<br \/><span class=\"gutter\">   9:<\/span><span class=\"syntax18\">}<\/span><br \/><span class=\"gutterH\">  10:<\/span><br \/><span class=\"gutter\">  11:<\/span><span class=\"syntax8\">use<\/span> constant LOCKDIR <span class=\"syntax18\">=<\/span><span class=\"syntax18\">&gt;<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">\/<\/span><span class=\"syntax13\">tmp<\/span><span class=\"syntax13\">\"<\/span>;<br \/><span class=\"gutter\">  12:<\/span><br \/><span class=\"gutter\">  13:<\/span><span class=\"syntax8\">my<\/span> <span class=\"syntax9\">$currentHost<\/span> <span class=\"syntax18\">=<\/span> hostname;<br \/><span class=\"gutter\">  14:<\/span><br \/><span class=\"gutterH\">  15:<\/span><span class=\"syntax8\">my<\/span> <span class=\"syntax9\">$progName<\/span> <span class=\"syntax18\">=<\/span> basename(<span class=\"syntax9\">$ARGV<\/span>[<span class=\"syntax5\">0<\/span>]);<br \/><span class=\"gutter\">  16:<\/span><span class=\"syntax10\">printf<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Executing<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">'<\/span><span class=\"syntax9\">%<\/span><span class=\"syntax9\">s<\/span><span class=\"syntax13\">'<\/span><span class=\"syntax13\">\\n<\/span><span class=\"syntax13\">\"<\/span>, <span class=\"syntax9\">$progName<\/span>;<br \/><span class=\"gutter\">  17:<\/span><span class=\"syntax8\">my<\/span> <span class=\"syntax9\">$lockfile<\/span> <span class=\"syntax18\">=<\/span> LOCKDIR . <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">\/<\/span><span class=\"syntax13\">\"<\/span> . <span class=\"syntax9\">$progName<\/span> . <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">.<\/span><span class=\"syntax13\">lock<\/span><span class=\"syntax13\">\"<\/span>;<br \/><span class=\"gutter\">  18:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">There<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">is<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">a<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">lockfile,<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">but<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">is<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">the<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">process<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">really<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">running?<\/span><br \/><span class=\"gutter\">  19:<\/span><span class=\"syntax8\">if<\/span> ( <span class=\"syntax18\">-<\/span>f <span class=\"syntax9\">$lockfile<\/span> ) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutterH\">  20:<\/span>        <span class=\"syntax8\">my<\/span> (<span class=\"syntax9\">$pid<\/span>, <span class=\"syntax9\">$hostname<\/span>, <span class=\"syntax9\">$prog<\/span>);<br \/><span class=\"gutter\">  21:<\/span>        <span class=\"syntax10\">open<\/span>(LOCK, <span class=\"syntax13\">\"<\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">lockfile<\/span><span class=\"syntax13\">\"<\/span>) <span class=\"syntax18\">|<\/span><span class=\"syntax18\">|<\/span> <span class=\"syntax8\">die<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">@<\/span><span class=\"syntax13\">,<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax9\">$<\/span><span class=\"syntax13\">!<\/span><span class=\"syntax13\">\"<\/span>;<br \/><span class=\"gutter\">  22:<\/span>        <span class=\"syntax8\">while<\/span>(<span class=\"syntax18\">&lt;<\/span>LOCK<span class=\"syntax18\">&gt;<\/span>) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  23:<\/span>                (<span class=\"syntax9\">$pid<\/span>, <span class=\"syntax9\">$hostname<\/span>, <span class=\"syntax9\">$prog<\/span>) <span class=\"syntax18\">=<\/span> <span class=\"syntax10\">split<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">;<\/span><span class=\"syntax13\">\"<\/span>, <span class=\"syntax9\">$_<\/span>);<br \/><span class=\"gutter\">  24:<\/span>        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutterH\">  25:<\/span>        <span class=\"syntax10\">close<\/span>(LOCK);<br \/><span class=\"gutter\">  26:<\/span>        <span class=\"syntax8\">my<\/span> <span class=\"syntax9\">$cnt<\/span> <span class=\"syntax18\">=<\/span> <span class=\"syntax10\">kill<\/span> <span class=\"syntax5\">0<\/span>, <span class=\"syntax9\">$pid<\/span>;<br \/><span class=\"gutter\">  27:<\/span>        <span class=\"syntax8\">if<\/span> (<span class=\"syntax9\">$cnt<\/span> <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax5\">0<\/span>) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  28:<\/span>                <span class=\"syntax8\">die<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Sorry<\/span><span class=\"syntax13\">,<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">but<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">the<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">programm<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">progName<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">is<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">already<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">running<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">as<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">the<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">PID<\/span><span class=\"syntax13\">:<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">pid<\/span><span class=\"syntax13\">\"<\/span><br \/><span class=\"gutter\">  29:<\/span>        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutterH\">  30:<\/span><span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  31:<\/span><span class=\"syntax10\">open<\/span>(LOCK, <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">&gt;<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">lockfile<\/span><span class=\"syntax13\">\"<\/span>) <span class=\"syntax18\">|<\/span><span class=\"syntax18\">|<\/span> <span class=\"syntax8\">die<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">@<\/span><span class=\"syntax13\">,<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax9\">$<\/span><span class=\"syntax13\">!<\/span><span class=\"syntax13\">\"<\/span>;<br \/><span class=\"gutter\">  32:<\/span><span class=\"syntax10\">print<\/span> LOCK (<span class=\"syntax13\">\"<\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">$<\/span><span class=\"syntax13\">\"<\/span> . <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">;<\/span><span class=\"syntax13\">\"<\/span> . <span class=\"syntax9\">$currentHost<\/span> . <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">;<\/span><span class=\"syntax13\">\"<\/span> . <span class=\"syntax9\">$progName<\/span>);<br \/><span class=\"gutter\">  33:<\/span><span class=\"syntax10\">close<\/span>(LOCK);<br \/><span class=\"gutter\">  34:<\/span><span class=\"syntax8\">my<\/span> <span class=\"syntax9\">$prog<\/span> <span class=\"syntax18\">=<\/span> <span class=\"syntax10\">shift<\/span>(<span class=\"syntax9\">@ARGV<\/span>);<br \/><span class=\"gutterH\">  35:<\/span><span class=\"syntax10\">exec<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">prog<\/span><span class=\"syntax13\">\"<\/span>, <span class=\"syntax9\">@ARGV<\/span>);<br \/><span class=\"gutter\">  36:<\/span>__END__<br \/><span class=\"gutter\">  37:<\/span><span class=\"syntax12\">=head1<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">NAME<\/span><br \/><span class=\"gutter\">  38:<\/span><br \/><span class=\"gutter\">  39:<\/span><span class=\"syntax2\">Run<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">a<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">single<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">instance<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">of<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">a<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">UNIX<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">process<\/span><span class=\"syntax2\">,<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">leaving<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">information<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">behind<\/span><br \/><span class=\"gutterH\">  40:<\/span><span class=\"syntax2\">to<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">ease<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">its<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">termination<\/span><span class=\"syntax2\">.<\/span><br \/><span class=\"gutter\">  41:<\/span><br \/><span class=\"gutter\">  42:<\/span><span class=\"syntax12\">=<\/span><span class=\"syntax12\">head1<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">DESCRIPTION<\/span><br \/><span class=\"gutter\">  43:<\/span><br \/><span class=\"gutter\">  44:<\/span><span class=\"syntax2\">Will<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">run<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">desired<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">command<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">and<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">will<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">create<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">a<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">lock<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">file<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">To<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">kill<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">program<\/span><span class=\"syntax2\">,<\/span><br \/><span class=\"gutterH\">  45:<\/span><span class=\"syntax2\">either<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">use<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">information<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">on<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">lock<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">file<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">or<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">call<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">smart_kill<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">script<\/span><br \/><span class=\"gutter\">  46:<\/span><br \/><span class=\"gutter\">  47:<\/span><span class=\"syntax2\">To<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">run<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">a<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">program<\/span><span class=\"syntax2\">:<\/span><br \/><span class=\"gutter\">  48:<\/span><br \/><span class=\"gutter\">  49:<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\">\/<\/span><span class=\"syntax2\">smart_run<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\">pl<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">script<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\">sh<\/span><br \/><span class=\"gutterH\">  50:<\/span><br \/><span class=\"gutter\">  51:<\/span><span class=\"syntax2\">To<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">run<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">on<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">background<\/span><span class=\"syntax2\">:<\/span><br \/><span class=\"gutter\">  52:<\/span><br \/><span class=\"gutter\">  53:<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\">\/<\/span><span class=\"syntax2\">smart_run<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\">pl<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">script<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\">sh<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">&<\/span><br \/><span class=\"gutter\">  54:<\/span><br \/><span class=\"gutterH\">  55:<\/span><span class=\"syntax12\">=<\/span><span class=\"syntax12\">head1<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">AuTHOR<\/span><br \/><span class=\"gutter\">  56:<\/span><br \/><span class=\"gutter\">  57:<\/span><span class=\"syntax2\">Jose<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Vicente<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Nunez<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Zuleta<\/span><br \/><span class=\"gutter\">  58:<\/span><br \/><span class=\"gutter\">  59:<\/span><span class=\"syntax12\">=<\/span><span class=\"syntax12\">head1<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">BLOG<\/span><br \/><span class=\"gutterH\">  60:<\/span><br \/><span class=\"gutter\">  61:<\/span><span class=\"syntax2\">KodeGeeK<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">-<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">http<\/span><span class=\"syntax2\">:<\/span><span class=\"syntax2\">\/<\/span><span class=\"syntax2\">\/<\/span><span class=\"syntax2\">kodegeek<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\">com<\/span><br \/><span class=\"gutter\">  62:<\/span><br \/><span class=\"gutter\">  63:<\/span><span class=\"syntax12\">=<\/span><span class=\"syntax12\">head1<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">LICENSE<\/span><br \/><span class=\"gutter\">  64:<\/span><br \/><span class=\"gutterH\">  65:<\/span><span class=\"syntax2\">LGPL<\/span><br \/><span class=\"gutter\">  66:<\/span><br \/><span class=\"gutter\">  67:<\/span><span class=\"syntax12\">=cut<\/span><br \/><\/pre>\n<p>Y el programa que lo mata:<\/p>\n<style type=\"text\/css\"><!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #dbdbdb; color: #000000; } .gutterH { background: #dbdbdb; color: #990066; } --><br \/><\/style>\n<p><\/p>\n<pre><span class=\"gutter\">   1:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\">!\/usr\/bin\/perl<\/span><br \/><span class=\"gutter\">   2:<\/span><br \/><span class=\"gutter\">   3:<\/span><span class=\"syntax8\">use<\/span> strict;<br \/><span class=\"gutter\">   4:<\/span><span class=\"syntax8\">use<\/span> File<span class=\"syntax18\">:<\/span><span class=\"syntax18\">:<\/span>Basename;<br \/><span class=\"gutterH\">   5:<\/span><span class=\"syntax8\">use<\/span> Sys<span class=\"syntax18\">:<\/span><span class=\"syntax18\">:<\/span>Hostname;<br \/><span class=\"gutter\">   6:<\/span><br \/><span class=\"gutter\">   7:<\/span><span class=\"syntax8\">if<\/span> (<span class=\"syntax10\">scalar<\/span>(<span class=\"syntax9\">@ARGV<\/span>) <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax5\">1<\/span>) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">   8:<\/span>        <span class=\"syntax8\">die<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Provide<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">the<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">name<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">of<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">the<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">program<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">to<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">be<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">killed<\/span><span class=\"syntax13\">!<\/span><span class=\"syntax13\">\"<\/span>;<br \/><span class=\"gutter\">   9:<\/span><span class=\"syntax18\">}<\/span><br \/><span class=\"gutterH\">  10:<\/span><br \/><span class=\"gutter\">  11:<\/span><span class=\"syntax8\">use<\/span> constant LOCKDIR <span class=\"syntax18\">=<\/span><span class=\"syntax18\">&gt;<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">\/<\/span><span class=\"syntax13\">tmp<\/span><span class=\"syntax13\">\"<\/span>;<br \/><span class=\"gutter\">  12:<\/span><br \/><span class=\"gutter\">  13:<\/span><span class=\"syntax8\">my<\/span> <span class=\"syntax9\">$currentHost<\/span> <span class=\"syntax18\">=<\/span> hostname;<br \/><span class=\"gutter\">  14:<\/span><br \/><span class=\"gutterH\">  15:<\/span><span class=\"syntax8\">my<\/span> <span class=\"syntax9\">$progName<\/span> <span class=\"syntax18\">=<\/span> <span class=\"syntax9\">$ARGV<\/span>[<span class=\"syntax5\">0<\/span>];<br \/><span class=\"gutter\">  16:<\/span><span class=\"syntax8\">my<\/span> <span class=\"syntax9\">$lockfile<\/span> <span class=\"syntax18\">=<\/span> LOCKDIR . <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">\/<\/span><span class=\"syntax13\">\"<\/span> . <span class=\"syntax9\">$progName<\/span> . <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">.<\/span><span class=\"syntax13\">lock<\/span><span class=\"syntax13\">\"<\/span>;<br \/><span class=\"gutter\">  17:<\/span><span class=\"syntax1\">#<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">There<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">is<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">a<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">lockfile,<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">but<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">is<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">the<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">process<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">really<\/span><span class=\"syntax1\"> <\/span><span class=\"syntax1\">running?<\/span><br \/><span class=\"gutter\">  18:<\/span><span class=\"syntax8\">if<\/span> ( <span class=\"syntax18\">-<\/span>f <span class=\"syntax9\">$lockfile<\/span> ) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  19:<\/span>        <span class=\"syntax10\">printf<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Trying<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">to<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">kill<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">'<\/span><span class=\"syntax9\">%<\/span><span class=\"syntax9\">s<\/span><span class=\"syntax13\">'<\/span><span class=\"syntax13\">\\n<\/span><span class=\"syntax13\">\"<\/span>, <span class=\"syntax9\">$progName<\/span>;<br \/><span class=\"gutterH\">  20:<\/span>        <span class=\"syntax8\">my<\/span> (<span class=\"syntax9\">$pid<\/span>, <span class=\"syntax9\">$hostname<\/span>, <span class=\"syntax9\">$prog<\/span>);<br \/><span class=\"gutter\">  21:<\/span>        <span class=\"syntax10\">open<\/span>(LOCK, <span class=\"syntax13\">\"<\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">lockfile<\/span><span class=\"syntax13\">\"<\/span>) <span class=\"syntax18\">|<\/span><span class=\"syntax18\">|<\/span> <span class=\"syntax8\">die<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax9\">$<\/span><span class=\"syntax9\">@<\/span><span class=\"syntax13\">,<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax9\">$<\/span><span class=\"syntax13\">!<\/span><span class=\"syntax13\">\"<\/span>;<br \/><span class=\"gutter\">  22:<\/span>        <span class=\"syntax8\">while<\/span>(<span class=\"syntax18\">&lt;<\/span>LOCK<span class=\"syntax18\">&gt;<\/span>) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  23:<\/span>                (<span class=\"syntax9\">$pid<\/span>, <span class=\"syntax9\">$hostname<\/span>, <span class=\"syntax9\">$prog<\/span>) <span class=\"syntax18\">=<\/span> <span class=\"syntax10\">split<\/span>(<span class=\"syntax13\">\"<\/span><span class=\"syntax13\">;<\/span><span class=\"syntax13\">\"<\/span>, <span class=\"syntax9\">$_<\/span>);<br \/><span class=\"gutter\">  24:<\/span>        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutterH\">  25:<\/span>        <span class=\"syntax10\">close<\/span>(LOCK);<br \/><span class=\"gutter\">  26:<\/span>        <span class=\"syntax8\">my<\/span> <span class=\"syntax9\">$cnt<\/span> <span class=\"syntax18\">=<\/span> <span class=\"syntax10\">kill<\/span> <span class=\"syntax5\">6<\/span>, <span class=\"syntax9\">$pid<\/span>;<br \/><span class=\"gutter\">  27:<\/span>        <span class=\"syntax8\">if<\/span> (<span class=\"syntax9\">$cnt<\/span> <span class=\"syntax18\">!<\/span><span class=\"syntax18\">=<\/span> <span class=\"syntax5\">0<\/span>) <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  28:<\/span>                <span class=\"syntax10\">printf<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">process<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax9\">%<\/span><span class=\"syntax9\">i<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">killed\\n<\/span><span class=\"syntax13\">\"<\/span>, <span class=\"syntax9\">$pid<\/span>;<br \/><span class=\"gutter\">  29:<\/span>                <span class=\"syntax10\">unlink<\/span> <span class=\"syntax9\">$lockfile<\/span>;<br \/><span class=\"gutterH\">  30:<\/span>        <span class=\"syntax18\">}<\/span> <span class=\"syntax8\">else<\/span> <span class=\"syntax18\">{<\/span><br \/><span class=\"gutter\">  31:<\/span>                <span class=\"syntax10\">printf<\/span> <span class=\"syntax13\">\"<\/span><span class=\"syntax13\">Unable<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">to<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax13\">kill<\/span><span class=\"syntax13\"> <\/span><span class=\"syntax9\">%<\/span><span class=\"syntax9\">i<\/span><span class=\"syntax13\">\\n<\/span><span class=\"syntax13\">\"<\/span>, <span class=\"syntax9\">$pid<\/span>;<br \/><span class=\"gutter\">  32:<\/span>                <span class=\"syntax8\">exit<\/span> <span class=\"syntax5\">192<\/span>;<br \/><span class=\"gutter\">  33:<\/span>        <span class=\"syntax18\">}<\/span><br \/><span class=\"gutter\">  34:<\/span><span class=\"syntax18\">}<\/span><br \/><span class=\"gutterH\">  35:<\/span>__END__<br \/><span class=\"gutter\">  36:<\/span><span class=\"syntax12\">=head1<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">NAME<\/span><br \/><span class=\"gutter\">  37:<\/span><br \/><span class=\"gutter\">  38:<\/span><span class=\"syntax2\">Terminates<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">a<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">single<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">instance<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">of<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">a<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">UNIX<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">process<\/span><span class=\"syntax2\">,<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">if<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">it<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">was<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">started<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">by<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">smart_run<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\">pl<\/span><br \/><span class=\"gutter\">  39:<\/span><span class=\"syntax2\">It<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">will<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">kill<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">process<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">only<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">if<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">current<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">process<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">name<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">and<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">host<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">matches<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">what<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">is<\/span><br \/><span class=\"gutterH\">  40:<\/span><span class=\"syntax2\">inside<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">lock<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">file<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">(<\/span><span class=\"syntax2\">and<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">also<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">if<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">you<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">are<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">owner<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">of<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">process<\/span><span class=\"syntax2\">)<\/span><span class=\"syntax2\">.<\/span><br \/><span class=\"gutter\">  41:<\/span><br \/><span class=\"gutter\">  42:<\/span><span class=\"syntax2\">To<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">kill<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">a<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">program<\/span><span class=\"syntax2\">:<\/span><br \/><span class=\"gutter\">  43:<\/span><br \/><span class=\"gutter\">  44:<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\">\/<\/span><span class=\"syntax2\">smart_kill<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\">pl<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">script<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\">sh<\/span><br \/><span class=\"gutterH\">  45:<\/span><br \/><span class=\"gutter\">  46:<\/span><span class=\"syntax2\">(<\/span><span class=\"syntax2\">Note<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">than<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">full<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">path<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">of<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">script<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">is<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">not<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">required<\/span><span class=\"syntax2\">,<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">just<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">the<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">name<\/span><span class=\"syntax2\">)<\/span><span class=\"syntax2\">.<\/span><br \/><span class=\"gutter\">  47:<\/span><br \/><span class=\"gutter\">  48:<\/span><span class=\"syntax12\">=<\/span><span class=\"syntax12\">head1<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">AuTHOR<\/span><br \/><span class=\"gutter\">  49:<\/span><br \/><span class=\"gutterH\">  50:<\/span><span class=\"syntax2\">Jose<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Vicente<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Nunez<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">Zuleta<\/span><br \/><span class=\"gutter\">  51:<\/span><br \/><span class=\"gutter\">  52:<\/span><span class=\"syntax12\">=<\/span><span class=\"syntax12\">head1<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">BLOG<\/span><br \/><span class=\"gutter\">  53:<\/span><br \/><span class=\"gutter\">  54:<\/span><span class=\"syntax2\">KodeGeeK<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">-<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">http<\/span><span class=\"syntax2\">:<\/span><span class=\"syntax2\">\/<\/span><span class=\"syntax2\">\/<\/span><span class=\"syntax2\">kodegeek<\/span><span class=\"syntax2\">.<\/span><span class=\"syntax2\">com<\/span><br \/><span class=\"gutterH\">  55:<\/span><br \/><span class=\"gutter\">  56:<\/span><span class=\"syntax12\">=<\/span><span class=\"syntax12\">head1<\/span><span class=\"syntax2\"> <\/span><span class=\"syntax2\">LICENSE<\/span><br \/><span class=\"gutter\">  57:<\/span><br \/><span class=\"gutter\">  58:<\/span><span class=\"syntax2\">LGPL<\/span><br \/><span class=\"gutter\">  59:<\/span><br \/><span class=\"gutterH\">  60:<\/span><span class=\"syntax12\">=cut<\/span><br \/><\/pre>\n<p>Una salida de ejemplo de los dos programas en acci\u00f3n:<\/p>\n<blockquote><p>[josevnz@localhost perl]$ <span style=\"color: rgb(0, 102, 0);\">.\/smart_run.pl \/home\/josevnz\/do_nothing.sh &#038;<\/span><br \/><span style=\"color: rgb(255, 0, 0);\">[1] 7998<\/span><br \/>[josevnz@localhost perl]$ Executing &#8216;do_nothing.sh&#8217;<br \/>Counter: 0<br \/>[josevnz@localhost perl]$ .<span style=\"color: rgb(0, 153, 0);\">\/smart_kill.pl do_nothing.sh<\/span><br \/>Trying to kill &#8216;do_nothing.sh&#8217;<br \/><span style=\"color: rgb(255, 0, 0);\">process 7998 killed<\/span><br \/><span style=\"color: rgb(255, 0, 0);\">Aborted<\/span><br \/>[josevnz@localhost perl]$<\/p><\/blockquote>\n<p>Me tom\u00f3 30 minutos hacer los dos scripts (usted es m\u00e1s inteligente, as\u00ed que seguro le tomar\u00e1 menos). Los scripts no son perfectos y de hecho pudieramos pensar en tener uno s\u00f3lo que haga las dos cosas en vez de dos.<\/p>\n<p>\u00bfComo los mejorar\u00eda usted?. Como siempre se puede <a href=\"https:\/\/sourceforge.net\/project\/showfiles.php?group_id=128692&#038;package_id=141100&amp;release_id=352278\">bajar el c\u00f3digo desde aqu\u00ed<\/a>.<\/p>\n<p>Buscar en Technorati: <a href=\"http:\/\/technorati.com\/tag\/perl\" rel=\"tag\">perl<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vamos a ver el siguiente problema: Usted rutinariamente ejecuta cierto programa en su sistema, el cual corre por una cantidad ilimitada de tiempo (como un demonio en UNIX); Rato m\u00e1s tarde se decide a matar el proceso y debe entonces empezar a buscar en que m\u00e1quina lo corrio y cual es el PID (program ID) <a class=\"read-more\" href=\"http:\/\/kodegeek.com\/blog\/2005\/08\/27\/echando-codigo-%c2%bfejecucion-de-programas-de-linea-de-comandos-mas-inteligente\/\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/848"}],"collection":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/comments?post=848"}],"version-history":[{"count":0,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/posts\/848\/revisions"}],"wp:attachment":[{"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/media?parent=848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/categories?post=848"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/kodegeek.com\/blog\/wp-json\/wp\/v2\/tags?post=848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}