شما هنوز به سیستم وارد نشده اید.

#1 2017-09-25 21:34:29

kia_hamedi
عضو
از : مهاباد
ثبت شده: 2017-02-23
ارسال ها: 5
وب سایت

اجرای یک اسکریپت قبل از شروع به کار پکمن

سلام دوستان

داستان نوشتن این مقاله برمیگرده به انجمن آرچ لینوکس
موضوع از این قراره که یکی از کاربرای آرچ در گروه تلگرامی انجمن آرچ مشکلی رو اینگونه مطرح کرده بود: من اگه میخوام با pacman شروع به آپدیت یا نصب بسته هام بکنم بعد از گذشت 5 دقیقه سیستم به حالت suspend میره) خب من هم در جواب ایشون راه خاموش کردن suspend رو گفتم که در تنظیمات میزکار در بخش power managment وجود داره همچنین گفتم اگه حال و حوصله گیک بازی و فان بازی داره میتونه یک اسکریپت بنویسه که هربار که pacman اجرا میشه بررسی کنه اگه pacman در حال اجرا بود سرویس suspend رو غیرفعال کنه
در جواب من دوست خوبم آرکوش گفت که این اسکریپت رو بنویسیم و در انجمن و گروه قرار بدیم دوستان بیشتر آشنا بشند
خب درواقع دستور متوقف کردن suspend کاری نداره یعنی شما در ترمینال دستور زیر رو تایپ کنید سرویس suspend متوقف میشه

systemctl start suspend.target

هدف من از این مقاله نوشت اسکریپت نیست بلکه هدف این مقاله آشنایی با یکی از قابلیت های مدیربسته آرچ یعنی پکمنه
خب بهتره اول یک اسکریپت بش بنویسیم کافیه با دستور زیر در ترمینال یک اسکریپت بش با ویم درست کنید

vim suspend.sh

انتظار دارم ویم رو بلد باشید پس روی دستورات ویم توضیح نمیدم اگه بلد نیستید میتونید از gedit یا هر ویرایشگر متن دیگه ای استفاده کنید
خب طبق معمول اسکریپت های بش باید در خط اول شبنگ اسکریپت رو بنویسیم

#!/bin/bash

بعد باید بیایم بررسی کنیم که پکمن یا هر سرویسی که نیاز داریم در حال اجرا هست یا نه
برای اینکار ما در لینوکس دستور ps رو داریم که تمام پروسه های درحال اجرای سیستم رو نمایش میده، اما خب خروجی این دستور زیاده پس باید دنبال راهی باشیم که در این خروجی ها جستجو کنیم
کافیه خروجی دستور ps رو به دستور grep بدیم تا بتونیم در داخل اون دنبال عبارت خودمون بگردیم

#!/bin/bash
ps | grep pacman

الان اسکریپت ما میشه اجرا بشه کافیه برای اجرا از ویم خارج بشید و با دستور زیر بهش حالت اجرایی بدید و اجراش کنید

chmod +x suspend.sh

الان این اسکریپت اگه اجرا بشه میاد لیست پروسه های سیستم رو بیرون میکشه و دنبال عبارت pacman میگرده برای اینکه نتیجه دقیقتری داشته باشیم و اینکه از دستور شرط هم استفاده کنیم من خروجی دستور grep رو به دستور wc میدم تا تعداد خطوطی که در اون عبارت pacman وجود داره رو بشماره

#!/bin/bash
ps | grep pacman | wc -l

خب این از این بیاید برای اینکه نتیجه دقیق تری بدست بیاد من یکم سویچ های دستورات رو بهشون اضافه که زحمت یادگیری سویچ ها با شما

#!/bin/bash
ps -ef | grep -v grep | grep pacman | wc -l

حال باید بررسی کنیم چون نتیجه نهایی دستور ما یک عدده و اون عدد تعداد پروسه هاییه که اسم pacman در اون ها وجود داره کافیه حالا با ید شرط بررسی کنیم که این تعداد از 0 بیشتره یا نه

#!/bin/bash
if (( $(ps -ef | grep -v grep | grep pacman | wc -l) > 0 ))

خب حتما کار با دستور if رو در بش بلدید چون دستور ما الان ناقصه و بسته نشده برای بسته شدن باید انتهای اون عبارت fi رو بنویسیم ولی خب ما میخوایم اگه پروسه pacman پیدا شده بود یک کاری برای ما انجام بده پس ما به این صورت مینویسم

#!/bin/bash
if (( $(ps -ef | grep -v grep | grep pacman | wc -l) > 0 ))
then
echo "pacman is running!!!"
#sudo systemctl stop suspend.target
fi

خب اگه به کدهای بالا دقت کرده باشید خیلی سادست میگه دنبال عبارت pacman در لیست پروسه های باز سیستم باش اگه عبارت وجود داشت بیا برای ما  عبارت (pacman is running) نمایش بده هم چنین برای دوست خوبمون که مشکل داشت خط بعدی رو به حالت کامنت قرار دادم دوست داشت استفاده کنه تا سرویس suspend متوقف بشه و در انتها دستور شرط رو با عبارت fi بستیم

خب ما الان یک اسکریپت داریم (هر اسکریپتی که شما نیاز دارید)
چطوری یک کاری کنیم که قبل از pacman اجرا بشه
این قسمت در واقع خیلی ربطی به اسکریپت نداره برای این بخش ما باید کدهای مدیربسته پکمن رو تغییر بدیم، فایل کانفیگ پمکن در شاخه etc و با اسم pacman.conf وجود داره پس اون رو یک ادیتون باز میکنیم

sudo vim /etc/pacman.conf

خب در بین دستورات و متن های مختلف پکمن دنبال عبارت XferCommand# باشید که در بخش [options] وجود داره این بخش واقعا برام جالبه چون میتونید خیلی کارهارو انجام بدید چیزی که در این بخش برای ما مهمه عبارت XferCommand# که نیاز مارو برطرف میکنه
اگه دقت کنید از این عبارت دوتا وجود داره و در حالت کامنت هستند، درواقع اینها مثال هایی برای یادگیری شما هستند

XferCommand = /usr/bin/curl -C - -f %u > %o#
XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u#

خب نگاه کنید به ساختارشون تا همه چیز رو متوجه بشید
در مثال های بالا از نرم افزار های curl و wget استفاده شده و جلوی اونها از عبارت های u% و o% که در واقع اگه خروجی یا لینک داشته باشید استفاده میشه
پس ما از مثال های بالا استفاده میکنیم و به تنهای بخش [options] اسکریپت خودمون رو اضافه میکنیم

XferCommand = /home/kia/suspend.sh

ذخیره میکنیم و ازش خارج میشیم
حالا کافیه از پکمن استفاده کنیم تا نتیجه رو ببینیم

[kia@Happy-PC ~]$ sudo pacman -Sy
[sudo] password for kia: 
:: Synchronizing package databases...
pacman is running!!!
pacman is running!!!
pacman is running!!!
pacman is running!!!
pacman is running!!!
pacman is running!!!
pacman is running!!!
pacman is running!!!
pacman is running!!!
pacman is running!!!

خب امیدوارم لذت برده باشید
موفق باشید

آخرین ویرایش توسط kia_hamedi (2017-09-27 13:02:17)

آفلاین

#2 2017-09-25 22:22:12

mazhar
عضو
ثبت شده: 2016-08-01
ارسال ها: 260

پاسخ: اجرای یک اسکریپت قبل از شروع به کار پکمن

سلام و عرض خسته نباشید smile
چند نکته هست لازمه گفته بشه، اول اینکه دستور XferCommand برای اجرای دستورات دلخواه نیست، درسته {کار} میکنه، ولی به این منظور ساخته نشده، از man pacman:

XferCommand = /path/to/command %u
           If set, an external program will be used to download all remote
           files. All instances of %u will be replaced with the download URL.
           If present, instances of %o will be replaced with the local
           filename, plus a “.part” extension, which allows programs like wget
           to do file resumes properly.

           This option is useful for users who experience problems with
           built-in HTTP/FTP support, or need the more advanced proxy support
           that comes with utilities like wget.

مشکل دیگه ای هم که این اسکریپت داره اینه که فقط با اجرای یه بار pacman تا زمانی که سیستم ریبوت نشه suspend غیر فعال میشه.

راه حل جایگزین به پیشنهاد من میتونه این باشه:

#!/bin/bash
if (( $(ps -ef | grep -v grep | grep pacman | wc -l) > 0 ))
then    
        sudo systemctl stop suspend.target
else
        sudo systemctl start suspend.target
fi

در ضمن چون دارید با دسترسی روت دستوری رو اجرا میکنید باید حتماً دسترسی لازم رو بهش بدید:

visudo
----------------------------------------------------
mazhar ALL=(root) NOPASSWD: /path/to/script

که میتونید با یه کرون تنظیم کنید هر چند دقیقه یه بار اجرا بشه.

آخرین ویرایش توسط mazhar (2017-09-25 22:23:14)

آفلاین

پانوشت انجمن

پشتیبانی توسط تیم آرچ لینوکس ایران و نیرو گرفته با FluxBB