انجمنهای فارسی اوبونتو
کمک و پشتیبانی => انجمن عمومی => نویسنده: Hashem-khan در 09 مهر 1404، 04:03 بظ
-
سلام
من از مدیرت پنجره openbox استفاده میکنم برا تغییر پس زمینه از برنامه nitrogen
برای تغیر خودکار پس زمینه به طور پیش فرض گزینه ای نداره
اما یه جسنجو کردم راه هایی بود که من نتونستم جواب بگیرم :(
اگه دوستان میتونن راه نمایی کنند
https://www.ubuntuopenbox.com/tips/Nitrogen-Wallpapers-Slideshow/
https://blog.desdelinux.net/en/automatically-change-wallpaper-with-nitrogen/
-
سلام
من از مدیرت پنجره openbox استفاده میکنم برا تغییر پس زمینه از برنامه nitrogen
برای تغیر خودکار پس زمینه به طور پیش فرض گزینه ای نداره
اما یه جسنجو کردم راه هایی بود که من نتونستم جواب بگیرم :(
اگه دوستان میتونن راه نمایی کنند
https://www.ubuntuopenbox.com/tips/Nitrogen-Wallpapers-Slideshow/
https://blog.desdelinux.net/en/automatically-change-wallpaper-with-nitrogen/
خود لینکها توضیح دادن !
- - -
از این اسکریپت استفاده کنید اگر جواب گرفتید همینجا اطلاع بدید .
- - -
یک فایل جدید بساز (مثلاً wallpaper-cycle.sh):
#!/bin/bash
# مسیر فولدر والپیپرها
WALLPAPERS="$HOME/Pictures/Wallpapers"
# همهی فایلهای تصویری داخل پوشه رو به ترتیب بگیر
while true; do
for fe in "$WALLPAPERS"/*; do
if [ -f "$fe" ]; then
nitrogen --set-zoom-fill "$fe"
sleep 300 # هر 300 ثانیه (5 دقیقه) عوض بشه
fi
done
done
قابل اجراش کن:
chmod +x ~/wallpaper-cycle.sh
نکتهها :
sleep 300 یعنی هر ۵ دقیقه. میتونی تغییرش بدی.
میتونی بهجای --set-zoom-fill گزینهی دلخواه nitrogen بذاری , مثل --set-scaled
با کامند screen در پس زمینه همیشه در حال اجرا باشه یا از cron کمک بگیر .
-
#!/bin/bash
WALLPAPERS="$HOME/hashem/.wallpapers/1/"
while true; do
for fe in "$WALLPAPERS"/*; do
if [ -f "$fe" ]; then
nitrogen --set-zoom-fill "$fe"
sleep 300
fi
done
done
این رو متوجه نشدم
با کامند screen در پس زمینه همیشه در حال اجرا باشه یا از cron کمک بگیر
-
اسکریپت رو چند بار اجرا کن ببین کار میکنه یا نه بعد که مطمئن شدی از screen کمک بگیر تا زمانی که کامپیوتر روشنه در حال اجرا باشه
آموزش این دستور رو از اینجا بخون [1] , آموزش cron هم از اینجا [2] .
[1] https://asamserver.com/blog/screen-command-in-linux/
[2] https://7learn.com/blog/what-is-cronjob
-
screen
cd ~
./wallpaper-cycle.sh
Ctrl + A + D
حالا صفحه screen بسته میشه و ترمینالتون آزاد میشه
حالا میخوایم مثلا برگردیم به سشن screen ی که باز بود
screen -r [Tab بزنید]
اسکرین برمیگرده به جایی که اسکریپت رو باز کرده بودیم
اینجوری این اسکریپت همیشه باز میمونه .
-
اسکریپت رو چند بار اجرا کن ببین کار میکنه یا نه
نه کار نمیکنه فقط پردازش cpu میره بالا :(
./wallpaper-cycle.sh
sh wallpaper-cycle.sh
-
اگر امکانش هست سریع تست کنید و سریعتر جواب بدید اینطوری رسیدن به نتیجه خیلی طول میکشه .
- - -
ببینید این دستور رو تو ترمینال میزنید اصلا کار میکنه ؟ بکگراند تصویرش عوض میشه یا نه :
/usr/bin/nitrogen --set-zoom-fill --random /home/hashem/.wallpapers/1/ --save
اگر کار کرد این رو ادامه بدید :
بدون sudo :
crontab -e
و این خط رو به آخر صفحه ای که باز شد اضافه کنید , بجای */20 مثلا بزارید 2 , که هر دو دقیقه تصویر رو عوض کنه , منتظر بمونید ببینید اعمال میشه یا نه .
*/20 * * * * (export DISPLAY=:0.0 && /bin/date && /usr/bin/nitrogen --set-zoom-fill --random /home/hashem/.wallpapers/1/ --save) > /tmp/myNitrogen.log 2>&1
بعد این دستور رو بزنید :
sudo service cron restart
-
دستور اول کار کرد و پس زمینه عوض شد.
دستور دوم به شکل زیر بود که تغییری نکرد
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
*/2 * * * * (export DISPLAY=:0.0 && /bin/date && /usr/bin/nitrogen --set-zoom-fill --random /home/hashem/.wallpapers/1/ --save) > /tmp/myNitrogen.log 2>&2# m h dom mon dow command
-
خب عالی , دستور اول اصل داستان هست که داره درست کار میکنه .
- - -
برای دستور دوم , اینجا فایل cron باز شده , اگر دقت کنید خطی که وارد کردید آخرش اینهارو اضافه زدید :
# m h dom mon dow command
و این باعث میشه دستور کامل نباشه و ارور بگیره .
شما دقیقا این رو وارد کنید :
*/2 * * * * (export DISPLAY=:0.0 && /bin/date && /usr/bin/nitrogen --set-zoom-fill --random /home/hashem/.wallpapers/1/ --save) > /tmp/myNitrogen.log 2>&1
این باید هر دو دقیقه بکگراند رو با cron برای شما تغییر بده . ما فقط برای تست دو دقیقه قرار دادیم بعدا میتونید ویرایش کنید و هر دقیقه ای که خواستید بزارید .
بعد cron رو دوباره ریستارت کنید :
sudo service cron restart
حتی میتونید دستور زیر که لاگ اجرا شدن دستورمون توسط cron هست رو با دستور زیر در یک ترمینال دیگه ببینید :
tail -f /tmp/myNitrogen.log
اگر خروجی دستور بالا رو برای من هم بزارید من راحت تر میتونم بفهمم چه خبره .
پنج دقیقه صبر کنید و ببینید بکگراند خودکار عوض میشه یا نه .
در ضمن با دستور زیر هم میتونید ببینید که cron در چه مرحله ای هست :
sudo journalctl -f
-
کار نکرد
tail -f /tmp/myNitrogen.log
tail: cannot open '/tmp/myNitrogen.log' for reading: No such file or directory
tail: no files remaining
sudo journalctl -f
[sudo] password for hashem:
Oct 03 23:58:23 lenove systemd[1]: cron.service: Deactivated successfully.
Oct 03 23:58:23 lenove systemd[1]: Stopped cron.service - Regular background program processing daemon.
Oct 03 23:58:23 lenove systemd[1]: Started cron.service - Regular background program processing daemon.
Oct 03 23:58:23 lenove sudo[3194]: pam_unix(sudo:session): session closed for user root
Oct 03 23:58:23 lenove cron[3202]: (CRON) INFO (pidfile fd = 3)
Oct 03 23:58:23 lenove cron[3202]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
Oct 03 23:58:38 lenove crontab[3220]: (hashem) BEGIN EDIT (hashem)
Oct 03 23:59:19 lenove crontab[3442]: (hashem) BEGIN EDIT (hashem)
Oct 04 00:00:22 lenove sudo[3859]: hashem : TTY=pts/2 ; PWD=/home/hashem ; USER=root ; COMMAND=/usr/bin/journalctl -f
Oct 04 00:00:22 lenove sudo[3859]: pam_unix(sudo:session): session opened for user root(uid=0) by hashem(uid=1000)
Oct 04 00:00:33 lenove systemd[1]: Starting dpkg-db-backup.service - Daily dpkg database backup service...
Oct 04 00:00:33 lenove systemd[1]: dpkg-db-backup.service: Deactivated successfully.
Oct 04 00:00:33 lenove systemd[1]: Finished dpkg-db-backup.service - Daily dpkg database backup service.
Oct 04 00:01:39 lenove dbus-daemon[950]: [session uid=1000 pid=950 pidfd=5] Activating via systemd: service name='ca.desrt.dconf' unit='dconf.service' requested by ':1.58' (uid=1000 pid=3898 comm="mousepad")
Oct 04 00:01:39 lenove systemd[923]: Starting dconf.service - User preferences database...
Oct 04 00:01:39 lenove dbus-daemon[950]: [session uid=1000 pid=950 pidfd=5] Successfully activated service 'ca.desrt.dconf'
Oct 04 00:01:39 lenove systemd[923]: Started dconf.service - User preferences database.
-
دوباره بزن:
crontab -e
شما دقیقا این رو وارد کنید در انتهای نوشته های اولش و در ویرایشگر ترجیحا nano :
*/2 * * * * (export DISPLAY=:0.0 && /bin/date && /usr/bin/nitrogen --set-zoom-fill --random /home/hashem/.wallpapers/1/ --save) > /tmp/myNitrogen.log 2>&1
بعد فایل رو ذخیره کن و از ویرایشگر بیا بیرون.
و خروجی این دستور رو برای من بزار همینجا:
crontab -l
-
crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
*/2 * * * * (export DISPLAY=:0.0 && /bin/date && /usr/bin/nitrogen --set-zoom-fill --random /home/hashem/.wallpapers/1/ --save) > /tmp/myNitrogen.log 2>&1
-
تا اینجا درسته
اینو بزن :
sudo service cron restart
پنج دقیقه صبر کن ببین چی میشه
و بعد خروجی این رو برام اینجا بزار :
sudo journalctl --since "30 minutes ago"
-
کار نمیکنه ۱۰ دقیقه هم صبرکردم :(
sudo journalctl --since "30 minutes ago"
Oct 04 22:23:39 lenove kernel: Linux version 6.16.8+deb14-amd64 (debian-kernel@lists.debian.or>
Oct 04 22:23:39 lenove kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-6.16.8+deb14-amd64 root=>
Oct 04 22:23:39 lenove kernel: x86/split lock detection: #AC: crashing the kernel on kernel sp>
Oct 04 22:23:39 lenove kernel: BIOS-provided physical RAM map:
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009efff] usable
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x000000000009f000-0x00000000000fffff] reserved
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x0000000000100000-0x0000000039f98fff] usable
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x0000000039f99000-0x000000003a898fff] reserved
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x000000003a899000-0x00000000434aefff] usable
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x00000000434af000-0x00000000452fefff] reserved
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x00000000452ff000-0x0000000045b2efff] ACPI NVS
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x0000000045b2f000-0x0000000045bfefff] ACPI data
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x0000000045bff000-0x0000000045bfffff] usable
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x0000000045c00000-0x0000000049ffffff] reserved
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x000000004a200000-0x000000004a3fffff] reserved
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x000000004b000000-0x00000000503fffff] reserved
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x00000000c0000000-0x00000000cfffffff] reserved
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x00000000fe010000-0x00000000fe010fff] reserved
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x00000000fed20000-0x00000000fed7ffff] reserved
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x00000000ff400000-0x00000000ffffffff] reserved
Oct 04 22:23:39 lenove kernel: BIOS-e820: [mem 0x0000000100000000-0x00000002afbfffff] usable
Oct 04 22:23:39 lenove kernel: NX (Execute Disable) protection: active
Oct 04 22:23:39 lenove kernel: APIC: Static calls initialized
Oct 04 22:23:39 lenove kernel: efi: EFI v2.7 by INSYDE Corp.
lines 1-24
-
همین دستور که برای شما کار کرد کافیه :
/usr/bin/nitrogen --set-zoom-fill --random /home/hashem/.wallpapers/1/ --save
همین رو بزاریم تو یه حلقه و هر ۲ دقیقه تصویر رو برای شما عوض کنه :
میتونید مثلا بزارید هر یک ساعت , اسکریپت رو تغییر بدید و ثانیه رو عوض کنید منظورم قسمت sleep هست :
#!/bin/bash
while true; do
/usr/bin/nitrogen --set-zoom-fill --random /home/hashem/.wallpapers/1/ --save
sleep 120 # هر 120 ثانیه (2 دقیقه) یکبار اجرا شود
done
بعد:
ذخیره کن (مثلاً در مسیر home):
~/wallpaper-loop.sh
قابل اجراش کن:
chmod +x ~/wallpaper-loop.sh
تستش کن:
./wallpaper-loop.sh
همینطور که در نوشته های قبلی توضیح دادم با screen هر بار که کامپیوتر رو که روشن کردید این اسکریپت رو اجراش کنید .
- - -
End
-
الان داره کار میکنه
screen رو نصب کردم و داره اجراع میشه \\:D/
چند نکته:
هربار که لپ تاپ روشن میکنم بادید دستور screen در ترمینال اجراع کنم؟
و زمان رو اگه مثلا بزارم ۲ ساعت بعد از ۱ ساعت لپ تاپ خاموش کنم
وقتی روشن شد از ۲ ساعت شروع مشه یا نه از زمان باقی مونده؟
-
عالی
۱ - بله , هر بار که سیستم رو روشن میکنی باید دوباره دستور screen رو بزنی و داخلش اسکریپت رو اجرا کنی.
۲ - اسکریپت ما یادش نمیمونه که چند دقیقه مونده بود.
یعنی مثلاً اگه زمان sleep رو گذاشتی ۲ ساعت (sleep 7200) و بعد از ۱ ساعت کامپیوتر خاموش کردی، وقتی روشنش کنی:
اسکریپت از اول حلقه شروع میکنه.
یعنی همون لحظه یه عکس جدید میذاره و دوباره از اول ۲ ساعت صبر میکنه.
۳ - وقتی سیستم از Suspend برمیگرده:
همون پردازهها (processes) دوباره از همون جا ادامه میدن.
اسکریپت توی screen هم دوباره ادامه میده از نقطهای که sleep درش بوده.
یعنی اگه درون اسکریپتت نوشته باشی (sleep 120) و سیستم مثلاً ثانیه ۱۰۰ بخوابه، وقتی بیدار بشه، sleep باقیمانده رو ادامه میده (حدود ۲۰ ثانیه دیگه بعد از بیداری تصویر عوض میشه).
۴ - در نهایت این روش رو میشه ترکیب کرد با cron و autostart اوپنباکس که اینهارو واگذار میکنم به خودت . با اینها میتونی اسکریپت رو زمان روشن کردن کامپیوتر یا سرساعت اجرا کنی. خودتون جستجو کنید.
~/.config/openbox/autostart
- - -
✋
-
میتونید دستور screan رو توی مسیر زیر بذارید. بعد از هر نشت، خودش اجرا میشه. میتونید یه دستور شرطی استفاده کنید که فقط توی نشت های گرافیکی اجرا بشه.
/etc/bash_bashrc
-
در نهایت این روش رو میشه ترکیب کرد با cron و autostart
چندین روش رو امتحان کردم هبچ کدوم رو نتونستم راه بندازم :(
مثل cron job یا systemd
میتونید دستور screan رو توی مسیر زیر بذارید.
مسیر خالی بود و دستور رو گذاشتم ولی اجراع نشد :(
-
درود.
شرمنده. مسیر درست اینه.
/etc/bash.bashrc
اون پروندهی مشکل دار رو حذف کنید.
فقط بدونید دستور screan باید توی bash.bashrc هم تعریف شده باشه.
بهتره اصلا کل کدنوشته رو توی مسیر زیر در یک پرونده جدا برارید. فقط اولش !# داشته باشه.
/etc/profile.d
-
بهتره اصلا کل کدنوشته رو توی مسیر زیر در یک پرونده جدا برارید. فقط اولش !# داشته باشه.
کدوم کد؟
من قبلا تو پوشه خانه یه screenrc ساختم
بعد تو فایل bashrc به آخرش screen اضافه کردم
که خوب نشد
# ~/.screenrc
defshell -bash # dash makes it a login shell