در حال اجرا قرار گرفتن یک اسکریپت در سرور WebHook


#1

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


#2

چه سروری ساختی؟ با چی ساختی؟ کارش چیه؟ سیستم عامل سرور چیه؟
اگر میشه اطلاعات بیشتر بده،


#3

ربات پایتون ساختم الان هم میخوام توی سرو قرارش بدم
با کتابخانه telepot
سیستم سرور من CentOS 7


#4

دقیقا نمیدونم مسیری که رفتید چی بوده و با این لایبرری که شما میگید هم کار نکردم ولی برای اینکه یه نرم‌افزار پایتون به صورت daemon اجرا بشه، میشه اینکار رو انجام داد:

یه فایل بسازید به نام /etc/systemd/system/myrobot.service و این متن رو (با تغییر آدرسهایی که توش نوشته شده) داخل اون فایل بذارید:

[Unit]
Description=Friendly daemon to serve my robot
After=network.target

[Service]
User=pouya
Group=users
WorkingDirectory=/home/pouya/myrobot
Environment="PATH=/home/pouya/myrobot/venv/bin"
ExecStart=/home/pouya/myrobot/venv/bin/python3.6 /home/pouya/myrobot/main.py

[Install]
WantedBy=multi-user.target

اینو از روی یکی از کانفیگهام کپی کردم و یه کم تغییرش دادم. (مطمئن نیستم خط ExecStart باید حتما آدرس کامل نوشته بشه یا فقط بنویسیم python main.py کافیه)
اسم یوزری که ربات توی homeش قرار داره pouya هست و اسم دایکتوری virtualenv رو venv گذاشتم و با python3.6 کار میکنه. این اطلاعات رو باید بنابر نیازتون تغییر بدید.

با دستور systemctl start myrobot و systemctl enable myrobot میتونید دیمن رو روشن کنید و فعالش کنید که وقتی سرور ریستارت میشه، بعد از وصل شدن به اینترنت، این دیمن روشن شه. (After=network.target برای همینکاره)
برای اینکه این دیمن با یوزر root اجرا نشه من User=pouya و Group=users رو نوشتم. بهتره که دیمن با یوزر root اجرا نشه و حتما با یه یوزری که دسترسی sudo نداره ران بشه.


البته هزارجای کار ممکنه با مشکل بر بخوره و به همین سادگیها هم نیست که یه متنی رو کپی کنیم و مطمئن باشیم که کار میکنه. به همین خاطر بعد از start کردن دیمن، حتما systemctl status myrobot رو بزنید تا مطمئن بشید اشکالی وجود نداره.
خلاصه امیدوارم به درد بخوره.


#5

خیلی ممنون ولی کامل نفعمیدم سیستم من centos 7 هستش


#6

هیچ راه ساده تری وجود نداره که همیشه در حال اجرا قرارش بدم


#7

تمام نرم‌افزارهایی که به صورت daemon اجرا میشن، همینکارو انجام میدن. فقط کانفیگهاشون یه کم فرق داره.

راه ساده‌تر هم هست. ولی منطقی نیست.
میتونید یه کاری کنید که نرم‌افزار رو اجرا کنید و بفرستیدش به بکگراند، که بعدش بتونید از ترمینالتون استفاده های دیگه کنید یا اصلا ببندیدش. ولی با این روش، کنترلی روی اجرا‌ی ربات ندارید و دسترسی به لاگ و اینطور چیزها هم ندارید.
روشش سادست، آخر کامندی که برای اجرا‌ی نرم‌افزار میزنید، یه & بنویسید.
مثلا:

python main.py &

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

cat file.txt | grep "hello"
dmesg | tail

برای اینکه دوتا نرم‌افزار یکی بعد از دیگری اجرا بشن، به شرط اینکه اولی درست اجرا شده باشه و return 0 کرده باشه، از && استفاده میکنیم.

mkdir myproject && cd myproject && virtualenv -p3 venv

برای اینکه نرم افزار دوم همزمان با اولی اجرا بشه و منتظر تموم شدن اولی نمونه، بینشون & میذاریم.

aria2c http://website.com/downloadfile.ogg & sudo apt install some-prgram

برای اینکه ترمینال آزاد بشه و بتونیم به بقیه‌ی کارمون برسیم، آخر دستور یه & میذاریم.

tar -zcvf my_archive.tar.gz &

برای اینکه نرم‌افزار دوم زمانی اجرا بشه که نرم‌افزار اول، ارور داده و چیزی بجز return 0 انجام داده، باید بین این دوتا نرم‌افزار ; بذاریم. (من وقتی اینو یاد گرفتم فهمیدم که چرا توی مثلا C++ که کد میزنیم، باید main با return 0; تموم بشه. برای اینکه به سیستم عامل بفهمونیم کارمونو درست انجام دادیم یا به یه ارور برخوردیم)

ls myfile.txt ; touch myfile.txt

برای اینکه خروجی یه نرم‌افزار رو (چیزی که قراره توی ترمینال نمایش بده) بریزیم توی یه فایل (برای لاگ گرفتن یا هر دلیل دیگه‌ای) از < استفاده میکنیم. برای اینکه دیتای جدید جایگزین قبلیها نشه و در ادامش نوشته بشه از << استفاده میکنیم.

echo "hello world" > myfile.txt
echo "hello world" >> myfile.txt
tree ~/project >> my_directory_tree.txt
run-some-app > log.txt

چیزهایی که گفتم رو میشه به صورت ترکیبی هم استفاده کرد.

sudo apt update && yes y | sudo apt upgrade

یادگرفتن bash خیلی مهم و مفیده. این چیزایی که گفتم یه سری از دستورات ساده و پرکاربرد بود.