مشکل دادن مسیر اجرا به فایل .service

سلام
من یک برنامه با پایتون نوشتم که نیاز هست همیشه اجرا بشه من برای اجرا شدن خودکار یک فایل سرویس ساختم
وقتی مسیررو توی فایل سرویس به صورت مطلق میدم مثلا:
home/loading/Pictures/bingwall/bingwall.py/
برنامه کاملا و درست اجرا میشه و وقتی systemctl tatus bingwall.service رو میزنم, برنامه کاملا درحال اجرا هست و هیچ مشکلی نداره

اما وقتی ادرس رو نسبی میدم برنامه اصلا پیدا نمیشه یعنی فایل service دقیقا کنار فایل bingwall.py هست

راهی هست که من ادرس نسبی به رو به فایل service. بدم ؟

بله راه برای اینکار هست.
ولی باید درنظر داشته باشید که هیچ ارتباط مستقیمی بین فایل service و فایل اجرایی شما وجود نداره! یعنی وقتی systemd میخواد سرویس رو ران کنه، به آدرس سرویس cd نمیکنه و این آدرس رو به صورت مطلق استفاده میکنه.

اگه میخواید آدرس فایل پایتون خودتون رو به صورت relative بدید، از این راه استفاده کنید:

[Unit]                                                                                                                                                     
Description=bingwall
After=multi-user.target
[email protected]

[Service]
Type=simple
WorkingDirectory=/home/<username>/<projectname>
ExecStart=python3 bingwall.py
StandardInput=tty-force

[Install]
WantedBy=multi-user.target

اینطوری systemd قبل از اجرا کردن ExecStart به اون آدرس که توی WorkingDirectory گفته شده cd میکنه.

1 Likes

سلام ، خیلی ممنونم ، من درواقع نیاز دارم تا فایل .service به پوشه ای که الان فایل سرویس داخلش هست cd کنه و فرض کنید این فایل سرویس رو چند نفر دیگه هم قراره اجرا کنن در سیستم خودشون و یوزر های خودشون

مشکل دیگه من این هست که میخام فایل .service برنامه پایتونی من رو به صورت root اجرا کنه ، درواقع برنامه من توی پوشه opt/ هست و وقتی اونجا اجرا میشه چند فایل مثل فایل تکست میسازه
اما چون permision نداره ، نمیتونه فایل هارو بریزه و کرش میکنه
راهی هم هست که فایل .service برنامه رو به صورت روت اجرا کنه و بتونا فایل هارو ذخیره کنه ؟

خب مساله اینجاست که توی استاندارد دایرکتوریهای unix (که لینوکس از این استاندارد پیروی میکنه) هر دایرکتوری برای یه چیز و یه کاری ساخته شده و نباید هرچیزی رو هرجایی بذاریم.
مثلا شما همه‌ی لاگهای سیستم رو توی /var/log میبینید. هیچوقت هیچ نرم‌افزاری لاگهاش رو جای دیگه نگهداری نمیکنه.

همینطور درمورد فایلهای اجرایی. اصولا توی /opt نگهداری میشن.
مثلا من firefox و telegram و blender رو که میخواستم از روی سورس اجرا کنم (و از apt نگیرم) ریختمشون توی /opt و بعد یک symlink زدم از اینجا به /usr/bin

شما هم اگه میخواید اسکریپت پایتونتون از همه‌ی یوزرها قابل اجرا باشه بهتره توی /opt قرارش بدید. دایرکتوری service داخل /etc هست. این دایرکتوری برای نگه‌داری تنظیمات نرم‌افزارهای مختلف هست (مثلا /etc/mysql/my.cnf) و اگه بخوایم چیزهای دیگه‌رو توش بذاریم شلخته میشه.

به نظر میرسه اینها رو میشه توی /var بسازه. البته اگه فایلها حیاتی نیستن و اشکالی نداره که با خاموش شدن سیستم، پاک بشن، میتونید اون فایلها رو داخل /tmp بسازید.

بله. به این شکل:

[Service]
User=root
Group=root
WorkingDirectory=/some/directory
ExecStart=python3 myscript.py

ولی پیشنهاد میشه اینکار رو انجام ندید. هرچیزی رو نباید root اجرا کنه. این حرکت یه کم خطرناکه.

یه راه، میتونه این باشه که توی /var یه دایرکتوری برای این اپلیکیشن درست کنید، بعد اون دایرکتوری رو به یه گروهی بدید که همه به اون گروه دسترسی دارن. مثلا:

sudo chown -R root:disk /var/myapp

اینطوری همه‌ی کسانی که توی گروه disk هستن، میتونن اون دایرکتوری رو ببینن و استفاده کنن. توی تنظیمات service هم بگید که سرویس با این group ران بشه.

1 Likes