چند روز پیش یک سناریویی درگیرش شدم، به این صورت بود که یکی از همکاران یک برنامه Java یی توی سرور مرکز تماس asterisk نوشته بود که هر سری بعد از ادیت کردن کدهای فایل جاوا نیاز بود اون برنامه خاصی که نوشته بود یکبار بسته بشه و دوباره باز بشه. در روز من چندین مورد درگیر این موضوع بودم و با توجه به اینکه دسترسی همکارم به سرور محدود بود و دسترسی باز و بسته کردن سرویس ها رو نداشت به ذهنم رسید که توی استریسک چکار کنم که با گرفتن یک فیچر کدی یک سرویس یا برنامه خاصی توی لینوکس باز و بسته بشه.
این اسکریت چند خطی رو نوشتم و با شما هم به اشتراک میگذارم. در ابتدا یک فایل با پسوند .sh درست کنید. ( مثلا service.sh) بعد از ان فراموش نکنید که پرمیژن اجرای به فایل اسکریپت تون بدید حتما.
در خط اول با استفاده از دستور ps aux تمام سرویس هایی که در سیستم در حال اجرا هستند نمایش داده میشود و با کمک دستور grep سرویس یا برنامه خاصی که مد نظرمون هست را از لیست دستور ps aux فیلتر میکنیم که فقط اون برنامه مد نظر ما را در خروجی نمایش دهد.
همانطور که در بالا هم مشاهده میکند خروجی ما دو خط داره که یک خطش مربوط به دستور خود grep میباشد. برای حذف کردن آن از لیست خروجی از دستور grep -v grep استفاده میکنیم که از لیست خروجی ها دستور grep را حذف میکند که تنها اون چیزی که ما میخواستیم رو برای ما در خروجی نمایش دهد.
در این مرحله قصد داریم ProccessID برنامه مد نظرمون رو به دست بیاریم که بعد از آن بتونیم اون رو ببندیم. در خروجی بالا دومین ستون از دستور ps شماره PID اون برنامه رو میزنه که برای فیلتر کردن اون از دستور awk کمک میگیریم که در خروجی فقط PID را به ما نمایش دهد.
خب حالا همین دستور بالا را درون یک متغییر میریزیم و با استفاده از دستور kill پراسس آیدی مربوط به برنامه ای که در بالا فیلتر کردیم را میبندیمش. سپس برای اجرای مجدد همون برنامه و فرستادن برنامه به بک گراند از دستور nohup استفاده میکنیم.
تا اینجای کار فقط اسکریپت رو نوشتیم. اکنون ما میخوایم یه کاری کنیم که وقتی از روی IP Phone شماره "ستاره 250 مربع" را شماره گیری کردم اون اسکریپته اجرا بشه. برای این کار فایل extensions.conf را با استفاده از یک ادیتور باز کنید :
به context داخلی هاتون برید یا یک کانتکست جداگانه ای برای این کار درست کنید سپس دستورات زیر را درون context تان کپی کنید و تغییرات را ذخیره کرده.
در خط دوم از dial plan مان باید مسیر فایل اسکریپتی که نوشتیم را وارد کنیم. و بعد از اتمام کار اسکریپت تماس را باید Hangup کنیم. (خط آخر). فراموش نکنید که بعد از ذخیره تغییرات دایل پلن استریسک را reload بدید.
اکنون شما وقتی از روی تلفن تان شماره *250# را شماره گیری میکنید برنامه مورد نظرتان را یکبار میبندد و دوباره باز میکند. شما میتوانید به دلخواه خودتان سناریو را عوض کنید و روش های مختلف را تست کنید.
خب همین بود. فراموش نکنید تجربیات خودتان را با ما به اشتراک بگذارید. با آرزوی موفقیت...
این اسکریت چند خطی رو نوشتم و با شما هم به اشتراک میگذارم. در ابتدا یک فایل با پسوند .sh درست کنید. ( مثلا service.sh) بعد از ان فراموش نکنید که پرمیژن اجرای به فایل اسکریپت تون بدید حتما.
کد PHP:
#!/bin/bash
var1=`ps aux | grep -v grep | grep Callcenter.jar | awk '{print $2}'`
kill -9 $var1
nohup /opt/jdk1.8.0_45/bin/java -jar /tmp/Callcenter_jar/Callcenter.jar &
echo ${var1}
کد PHP:
[root@callcenter ~]# ps aux | grep java
root 5088 1.7 3.9 5659096 398316 ? Sl 13:53 0:28 /opt/jdk1.8.0_45/bin/java -jar /tmp/Callcenter_jar/Callcenter.jar
root 5475 0.0 0.0 103252 868 pts/2 S+ 14:19 0:00 grep java
کد PHP:
[root@callcenter ~]# ps aux | grep java | grep -v grep
root 5088 1.7 3.9 5659096 398316 ? Sl 13:53 0:28 /opt/jdk1.8.0_45/bin/java -jar /tmp/Callcenter_jar/Callcenter.jar
کد PHP:
[root@callcenter ~]# ps aux | grep -v grep | grep Callcenter.jar | awk '{print $2}'
5088
کد PHP:
#!/bin/bash
var1=`ps aux | grep -v grep | grep Callcenter.jar | awk '{print $2}'`
kill -9 $var1
nohup /opt/jdk1.8.0_45/bin/java -jar /tmp/Callcenter_jar/Callcenter.jar &
کد PHP:
vim /etc/asterisk/extensions.conf
کد PHP:
[internal]
;java service restart
;exten => *250,1,Authenticate(250)
exten => *250,n,system(/root/./service.sh)
exten => *250,n,hangup()
کد PHP:
callcenter*CLI> reload
OR
callcenter*CLI> dialplan reload
خب همین بود. فراموش نکنید تجربیات خودتان را با ما به اشتراک بگذارید. با آرزوی موفقیت...