{"id":369,"date":"2015-10-28T04:16:44","date_gmt":"2015-10-28T04:16:44","guid":{"rendered":"http:\/\/onlinelab.info\/?p=369"},"modified":"2015-10-28T04:16:44","modified_gmt":"2015-10-28T04:16:44","slug":"mot-so-doan-script-tien-ich-hay-dung","status":"publish","type":"post","link":"https:\/\/www.asianux.org.vn\/index.php\/2015\/10\/28\/mot-so-doan-script-tien-ich-hay-dung\/","title":{"rendered":"M\u1ed9t s\u1ed1 \u0111o\u1ea1n script ti\u1ec7n \u00edch hay d\u00f9ng"},"content":{"rendered":"<p>Th\u1eddi k\u1ef3 m\u1edbi \u0111i l\u00e0m t\u00f4i ngh\u0129 c\u1ee9 ph\u1ea3i g\u00f5 th\u1eadt nhi\u1ec1u cho quen cho nh\u1edb nh\u01b0ng l\u00e2u d\u1ea7n vi\u1ec7c \u0111\u00f3 cho c\u1ea3m gi\u00e1c th\u1eadt nh\u00e0m ch\u00e1n. Hi\u1ec7n gi\u1edd, nh\u1eefng g\u00ec t\u00f4i hay l\u00e0m th\u01b0\u1eddng xuy\u00ean t\u00f4i th\u01b0\u1eddng l\u01b0u v\u00e0o m\u1ed9t n\u01a1i. Khi c\u1ea7n t\u00f4i ch\u1ec9 vi\u1ec7c l\u00f4i ra, s\u1eeda l\u1ea1i \u0111\u00f4i ch\u00fat. Kipalog l\u00e0 m\u1ed9t n\u01a1i l\u01b0u tr\u1eef nh\u01b0 v\u1eady, th\u1eadm ch\u00ed c\u00f2n t\u1ed1t h\u01a1n \ud83d\ude00<\/p>\n<p>B\u00e0i vi\u1ebft n\u00e0y m\u1ee5c \u0111\u00edch s\u1ebd t\u1eadp trung c\u00e1c \u0111o\u1ea1n script nh\u1ecf ng\u1eafn. M\u1ed7i script t\u00f4i s\u1ebd \u0111\u1ec1 c\u1eadp \u0111\u1ebfn t\u00ecnh hu\u1ed1ng s\u1eed d\u1ee5ng n\u00f3. N\u1ebfu b\u1ea1n n\u00e0o th\u1ea5y c\u00f3 th\u1ec3 l\u00e0m t\u1ed1t h\u01a1n, t\u1ed1i \u01b0u h\u01a1n, ho\u1eb7c ch\u1ec9 c\u1ea7n m\u1ed9t c\u00e1ch kh\u00e1c h\u01a1n th\u00ec h\u00e3y \u0111\u1ec3 l\u1ea1i comment. Nh\u1eefng comment c\u1ee7a b\u1ea1n r\u1ea5t gi\u00e1 tr\u1ecb v\u1edbi t\u00f4i. B\u00e0i vi\u1ebft n\u00e0y s\u1ebd \u0111\u01b0\u1ee3c update d\u00e0i d\u00e0i. B\u1ea1n n\u00e0o th\u00edch c\u00f3 th\u1ec3 b\u1ed5 sung th\u00eam c\u00e1c script n\u1eefa nh\u00e9 \ud83d\ude00<\/p>\n<h3 class=\"ui dividing header\">T\u1eaft h\u00e0ng lo\u1ea1t process theo pid<\/h3>\n<p><strong>T\u00ecnh hu\u1ed1ng:<\/strong><span class=\"Apple-converted-space\">\u00a0<\/span><br \/>\nT\u1ea1i sao t\u00f4i kh\u00f4ng d\u00f9ng killall ? V\u00ec m\u1ed9t s\u1ed1 \u1ee9ng d\u1ee5ng t\u1ea1o ra nhi\u1ec1u process c\u00f3 t\u00ean kh\u00e1c nhau v\u00ed d\u1ee5 mysql ch\u1eb3ng h\u1ea1n. Khi start mysql service th\u01b0\u1eddng n\u00f3 duy tr\u00ec hai process mysqld_safe v\u00e0 mysqld v\u00e0 m\u1ed9t c\u00f2n m\u1ed9t l\u00fd do l\u00e0 \u0111\u00f4i khi process b\u1ecb treo, signal SIGTERM kh\u00f4ng th\u1ec3 t\u1eaft \u0111\u01b0\u1ee3c process. Trong t\u00ecnh hu\u1ed1ng \u0111\u00f3 t\u00f4i ph\u1ea3i d\u00f9ng SIGKILL. Tuy kh\u00f4ng ph\u1ea3i gi\u1ea3i ph\u00e1p t\u1ed1t nh\u01b0ng \u0111\u00f4i khi v\u1eabn ph\u1ea3i d\u00f9ng. Killall m\u1eb7c \u0111\u1ecbnh l\u1ea1i s\u1eed d\u1ee5ng signal SIGTERM.<\/p>\n<p><strong>Script:<\/strong><br \/>\n<code>ps -elf | grep &lt;process_name&gt; | grep -v \"grep\" | awk '{print $4}' | xargs kill -s SIGTERM<\/code><\/p>\n<p><em>grep -v &#8220;grep&#8221; \u0111\u1ec3 lo\u1ea1i b\u1ecf ch\u00ednh process grep m\u00e0 \u0111ang s\u1eed d\u1ee5ng trong script<\/em><br \/>\n<em>$4 l\u00e0 v\u1ecb tr\u00ed c\u1ee7a PID &#8211; c\u1ed9t th\u1ee9 4 trong output c\u1ee7a ps -elf<\/em><\/p>\n<p>UPDATE 1:<br \/>\nB\u1ea1n L\u00ea M\u1ea1nh C\u01b0\u1eddng c\u00f3 \u0111\u00f3ng g\u00f3p m\u1ed9t c\u00e1ch kh\u00e1c v\u00e0 c\u0169ng \u00edt ph\u1ea3i qua nhi\u1ec1u pipe h\u01a1n n\u00ean s\u1ebd t\u1ed1i \u01b0u h\u01a1n. T\u00f4i c\u1eadp nh\u1eadt lu\u00f4n v\u00e0o b\u00e0i vi\u1ebft ch\u00ednh:<\/p>\n<p><code>ps -elf | awk '\/&lt;process_name&gt;\/ &amp;&amp; !\/awk\/ {print $4}' | xargs -r kill -s SIGTERM<\/code><\/p>\n<ul class=\"ui list\">\n<li>S\u1ed1 pipe s\u1eed d\u1ee5ng \u0111\u00e3 gi\u1ea3m h\u1eb3n<\/li>\n<li>C\u00e2u l\u1ec7nh cu\u1ed1i c\u00f3 s\u1eed d\u1ee5ng tham s\u1ed1 -r c\u1ee7a xargs \u0111\u1ec3 \u00e9p xargs s\u1ebd kh\u00f4ng l\u00e0m g\u00ec c\u1ea3 n\u1ebfu input kh\u00f4ng c\u00f3. (-r l\u00e0 m\u1ed9t gnu extension)<\/li>\n<\/ul>\n<h3 class=\"ui dividing header\">S\u1eed d\u1ee5ng nohup \u0111\u1ec3 duy tr\u00ec process ngay khi c\u1ea3 shell b\u1ecb \u0111\u00f3ng<\/h3>\n<p><strong>T\u00ecnh hu\u1ed1ng:<\/strong><span class=\"Apple-converted-space\">\u00a0<\/span><br \/>\nM\u1ed9t s\u1ed1 process ch\u1ea1y background l\u00e0m nhi\u1ec7m v\u1ee5 l\u1eafng nghe s\u1ef1 ki\u1ec7n n\u00e0o \u0111\u00f3 th\u00ec c\u1ea7n \u0111\u01b0\u1ee3c duy tr\u00ec li\u00ean t\u1ee5c. Kh\u1edfi \u0111\u1ed9ng m\u1ed9t l\u1ea7n v\u00e0 ch\u1ea1y li\u00ean t\u1ee5c. Nghe c\u00f3 v\u1ebb gi\u1ed1ng m\u1ed9t service. Th\u1ef1c ra c\u00f3 th\u1ec3 vi\u1ebft m\u1ed9t init script \u0111\u1ec3 kh\u1edfi ch\u1ea1y c\u00e1c process ki\u1ec3u nh\u01b0 v\u1eady. Nh\u01b0ng c\u00f3 m\u1ed9t c\u00e1ch \u0111\u01a1n gi\u1ea3n h\u01a1n. \u0110\u00f3 l\u00e0 d\u00f9ng nohup. T\u00f4i kh\u00f4ng ch\u1eafc l\u00e0 t\u1ed1t h\u01a1n nh\u01b0ng ch\u1ec9 l\u00e0 \u0111\u01a1n gi\u1ea3n h\u01a1n.<\/p>\n<p>Ti\u1ec7n \u00edch n\u00e0y cho ph\u00e9p duy tr\u00ec process ch\u1ea1y trong ch\u1ebf \u0111\u1ed9 background ngay c\u1ea3 khi shell m\u00e0 t\u00f4i g\u1ecdi nohup b\u1ecb \u0111\u00f3ng. N\u00f3 c\u0169ng cho ph\u00e9p ghi log.<\/p>\n<p><strong>Script:<\/strong><\/p>\n<pre><code class=\"ui segment hljs gradle\">nohup  <span class=\"hljs-regexp\">\/usr\/<\/span>bin<span class=\"hljs-regexp\">\/php long_running_process.php &gt; \/<\/span>var<span class=\"hljs-regexp\">\/log\/<\/span>nohup_long_running_process.log &amp;\n<\/code><\/pre>\n<p>N\u1ebfu t\u00f4i c\u1ea7n c\u00e2u l\u1ec7nh tr\u00ean \u0111\u01b0\u1ee3c ch\u1ea1y sau khi h\u1ec7 th\u1ed1ng reboot th\u00ec t\u00f4i ch\u1ec9 c\u1ea7n \u0111\u1eb7t c\u00e2u l\u1ec7nh \u0111\u00f3 v\u00e0o m\u1ed9t script. V\u00ed d\u1ee5:<span class=\"Apple-converted-space\">\u00a0<\/span><code>test_long_running_process.sh<\/code><span class=\"Apple-converted-space\">\u00a0<\/span>Sau \u0111\u00f3 trong file<span class=\"Apple-converted-space\">\u00a0<\/span><code>\/etc\/rc.local<\/code><span class=\"Apple-converted-space\">\u00a0<\/span>(File n\u00e0y lu\u00f4n \u0111\u01b0\u1ee3c g\u1ecdi m\u1ed7i khi h\u1ec7 th\u1ed1ng kh\u1edfi \u0111\u1ed9ng) T\u00f4i khai b\u00e1o:<br \/>\n<code>\/full\/path\/to\/test_long_running_process.sh<\/code><\/p>\n<h3 class=\"ui dividing header\">Duy tr\u00ec m\u1ed9t s\u1ed1 l\u01b0\u1ee3ng file nh\u1ea5t \u0111\u1ecbnh trong m\u1ed9t th\u01b0 m\u1ee5c<\/h3>\n<p><strong>T\u00ecnh hu\u1ed1ng:<\/strong><br \/>\n\u0110\u1ec3 \u0111\u1ea3m b\u1ea3o h\u1ec7 th\u1ed1ng ph\u1ee5c h\u1ed3i khi c\u00f3 th\u1ea3m h\u1ecda x\u1ea3y ra, t\u00f4i c\u1ea7n th\u1ef1c hi\u1ec7n backup \u0111\u1ecbnh k\u1ef3. C\u00e1c b\u1ea3n backup n\u00e0y ban \u0111\u1ea7u th\u00ec kh\u00f4ng \u0111\u00e1ng k\u1ec3 v\u1ec1 dung l\u01b0\u1ee3ng nh\u01b0ng qu\u00e1 tr\u00ecnh t\u00edch l\u0169y s\u1ebd ng\u1ed1n s\u1ea1ch kh\u00f4ng gian l\u01b0u tr\u1eef. \u0110\u1ec3 tr\u00e1nh t\u00ecnh hu\u1ed1ng n\u00e0y x\u1ea3y ra, t\u00f4i c\u1ea7n ph\u1ea3i \u0111\u1ecbnh k\u1ef3 x\u00f3a b\u1edbt c\u00e1c b\u1ea3n backup \u0111\u00e3 qu\u00e1 c\u0169. \u1ede \u0111\u00e2y c\u00f3 ba y\u00eau c\u1ea7u cho nhi\u1ec7m v\u1ee5 n\u00e0y:<\/p>\n<ul class=\"ui list\">\n<li>Duy tr\u00ec m\u1ed9t s\u1ed1 l\u01b0\u1ee3ng nh\u1ea5t \u0111\u1ecbnh c\u00e1c b\u1ea3n backup. Ch\u00fa \u00fd c\u00e1c b\u1ea3n backup \u1edf \u0111\u00e2y l\u00e0 th\u01b0 m\u1ee5c<\/li>\n<li>C\u00e1c b\u1ea3n backup \u0111\u01b0\u1ee3c gi\u1eef l\u1ea1i ph\u1ea3i l\u00e0 m\u1edbi nh\u1ea5t<\/li>\n<li>\u0110\u1ecbnh k\u1ef3 theo d\u00f5i v\u00e0 x\u00f3a b\u1ecf n\u1ebfu s\u1ed1 l\u01b0\u1ee3ng b\u1ea3n backup v\u01b0\u1ee3t qu\u00e1 s\u1ed1 quy \u0111\u1ecbnh.<\/li>\n<\/ul>\n<p><strong>\u0110i\u1ec1u ki\u1ec7n:<\/strong><br \/>\nC\u00e1c th\u01b0 m\u1ee5c k\u1ebft xu\u1ea5t t\u1eeb qu\u00e1 tr\u00ecnh backup kh\u00f4ng n\u00ean \u0111\u1eb7t \u1edf d\u1ea1ng qu\u00e1 \u0111\u1eb7c bi\u1ec7t nh\u01b0 th\u01b0 m\u1ee5c \u1ea9n, c\u00f3 d\u1ea5u &#8211; \u1edf \u0111\u1ea7u d\u00f2ng ho\u1eb7c c\u00f3 new line trong t\u00ean. Script kh\u00f4ng h\u1ed7 tr\u1ee3 x\u1eed l\u00fd c\u00e1c th\u01b0 m\u1ee5c c\u00f3 t\u00ean k\u1ef3 d\u1ecb nh\u01b0 v\u1eady.<\/p>\n<p><strong>Script:<\/strong><br \/>\n\u1ede \u0111\u00e2y t\u00f4i duy tr\u00ec ba b\u1ea3n backup m\u1edbi nh\u1ea5t<br \/>\nScript backup_cleaner.sh<\/p>\n<pre><code class=\"ui segment hljs vim\"><span class=\"hljs-keyword\">ls<\/span> -td1 \/data\/backup\/*\/ | tail -<span class=\"hljs-keyword\">n<\/span> +<span class=\"hljs-number\">4<\/span> | xargs -<span class=\"hljs-keyword\">r<\/span> rm -rfv <span class=\"hljs-number\">2<\/span>&gt; \/var\/<span class=\"hljs-built_in\">log<\/span>\/backup_cleaner.<span class=\"hljs-built_in\">log<\/span>\n<\/code><\/pre>\n<p>-t \u0111\u1ec3 sort c\u00e1c th\u01b0 m\u1ee5c con trong th\u01b0 m\u1ee5c \/data\/backup theo th\u1eddi gian. Nh\u1eefng th\u01b0 m\u1ee5c m\u1edbi nh\u1ea5t s\u1ebd x\u1ebfp tr\u00ean \u0111\u1ea7u.<br \/>\n-d \u0111\u1ec3 ch\u1ec9 list c\u00e1c directory trong \/data\/backup\/*\/ v\u00ec c\u00e1c b\u1ea3n backup \u0111\u01b0\u1ee3c k\u1ebft xu\u1ea5t \u1edf d\u1ea1ng th\u01b0 m\u1ee5c.<\/p>\n<p><strong>Ch\u00fa \u00fd:<\/strong><br \/>\n\u0110\u1ec3 ls ch\u1ec9 li\u1ec7t k\u00ea \u0111\u01b0\u1ee3c th\u01b0 m\u1ee5c con c\u1ee7a \/data\/backup. B\u1ea1n ph\u1ea3i d\u00f9ng d\u1ea1ng c\u00fa ph\u00e1p<\/p>\n<pre><code class=\"ui segment hljs haskell\"><span class=\"hljs-title\">ls<\/span> -td \/<span class=\"hljs-typedef\"><span class=\"hljs-keyword\">data<\/span>\/backup\/*\/<\/span>\n<\/code><\/pre>\n<p>S\u1eed d\u1ee5ng<\/p>\n<pre><code class=\"ui segment hljs haskell\"><span class=\"hljs-title\">ls<\/span> -td \/<span class=\"hljs-typedef\"><span class=\"hljs-keyword\">data<\/span>\/backup\/*<\/span>\n<\/code><\/pre>\n<p>s\u1ebd tr\u1ea3 v\u1ec1 c\u1ea3 file l\u1eabn th\u01b0 m\u1ee5c con.<\/p>\n<p>-1 \u0111\u1ec3 c\u00e1c k\u1ebft qu\u1ea3 \u0111\u01b0\u1ee3c s\u1eafp x\u1ebfp theo t\u1eebng d\u00f2ng, m\u1ed7i d\u00f2ng m\u1ed9t k\u1ebft qu\u1ea3 (Script v\u1eabn ch\u1ea1y \u0111\u00fang m\u1ee5c \u0111\u00edch khi kh\u00f4ng c\u00f3 tham s\u1ed1 -1 n\u00e0y)<\/p>\n<p>K\u1ebft qu\u1ea3 c\u1ee7a c\u00e2u l\u1ec7nh ban \u0111\u1ea7u \u0111\u01b0\u1ee3c chuy\u1ec3n v\u00e0o tail \u0111\u1ec3 l\u1ea5y ra c\u00e1c k\u1ebft qu\u1ea3 t\u1eeb th\u1ee9 t\u01b0 tr\u1edf \u0111i r\u1ed3i \u0111\u1ea9y v\u00e0o rm -rf \u0111\u1ec3 x\u00f3a. Nh\u01b0 v\u1eady s\u1ebd lu\u00f4n gi\u1eef lai ba k\u1ebft qu\u1ea3 \u0111\u1ea7u ti\u00ean, c\u0169ng l\u00e0 m\u1edbi nh\u1ea5t.<\/p>\n<p><strong>Ch\u00fa \u00fd:<\/strong><br \/>\nV\u00ec k\u1ebft qu\u1ea3 cu\u1ed1i c\u00f9ng c\u1ee7a script l\u00e0 x\u00f3a th\u01b0 m\u1ee5c n\u00ean trong l\u1ec7nh \u0111\u1ea7u ti\u00ean t\u00f4i ph\u1ea3i s\u1eed d\u1ee5ng \u0111\u01b0\u1eddng d\u1eabn tuy\u1ec7t \u0111\u1ed1i \u0111\u1ec3 c\u00e2u l\u1ec7nh r\u00f5 r\u00e0ng nh\u1ea5t c\u00f3 th\u1ec3.<\/p>\n<p>Cu\u1ed1i c\u00f9ng \u0111\u1ec3 ho\u1ea1t \u0111\u1ed9ng n\u00e0y \u0111\u01b0\u1ee3c \u0111\u1ecbnh k\u1ef3 th\u1ef1c hi\u1ec7n, t\u00f4i \u0111\u1ea9y script n\u00e0y v\u00e0o crontab<br \/>\nsudo crontab -e<\/p>\n<pre><code class=\"ui segment hljs vim\">*\/<span class=\"hljs-number\">1<\/span> * * * * \/full\/path\/<span class=\"hljs-keyword\">to<\/span>\/backup_cleaner.<span class=\"hljs-keyword\">sh<\/span><\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Th\u1eddi k\u1ef3 m\u1edbi \u0111i l\u00e0m t\u00f4i ngh\u0129 c\u1ee9 ph\u1ea3i g\u00f5 th\u1eadt nhi\u1ec1u cho quen cho nh\u1edb nh\u01b0ng l\u00e2u d\u1ea7n vi\u1ec7c \u0111\u00f3 cho c\u1ea3m gi\u00e1c th\u1eadt nh\u00e0m ch\u00e1n. Hi\u1ec7n gi\u1edd, nh\u1eefng g\u00ec t\u00f4i hay l\u00e0m th\u01b0\u1eddng&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-369","post","type-post","status-publish","format-standard","hentry","category-linux"],"_links":{"self":[{"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/posts\/369","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/comments?post=369"}],"version-history":[{"count":0,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/posts\/369\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/media?parent=369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/categories?post=369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/tags?post=369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}