ฉันจะเรียกใช้สคริปต์โดยอัตโนมัติเมื่อ Ubuntu เริ่มทำงานได้อย่างไรฉันจึงไม่ต้องเรียกใช้สคริปต์ด้วยตนเองหลังจากเริ่มทำงาน
ฉันจะเรียกใช้สคริปต์โดยอัตโนมัติเมื่อ Ubuntu เริ่มทำงานได้อย่างไรฉันจึงไม่ต้องเรียกใช้สคริปต์ด้วยตนเองหลังจากเริ่มทำงาน
คำตอบ:
ทั้งนี้ขึ้นอยู่กับสิ่งที่จัดเรียงของสคริปต์ที่คุณต้องทำงาน .. สำหรับการบริการและชอบที่คุณควรใช้พุ่งพรวด แต่สำหรับสคริปต์ผู้ใช้ควรเรียกใช้งานเป็นสคริปต์เซสชันโดย gnome ดูที่ระบบ> การตั้งค่า> แอปพลิเคชันเริ่มต้น
ในบันทึกด้านข้างหากคุณต้องการให้สคริปต์บางตัวทำงานในการล็อกอินของเทอร์มินัลคุณสามารถเพิ่มสคริปต์เหล่านั้นลงในไฟล์. bash_loginในโฮมไดเร็กตอรี่ของคุณได้
คำสั่งง่าย ๆ (คำสั่งที่ไม่ต้องการให้ทำงาน) สามารถใช้งาน Upstart เช่น:
start on startup
task
exec /path/to/command
บันทึกสิ่งนี้ใน.conf
ไฟล์เป็น/etc/init
(หากคุณต้องการให้มันทำงานเป็นรูทเมื่อระบบบูทขึ้น) หรือใน~/.config/upstart
(หากคุณต้องการให้มันทำงานในฐานะผู้ใช้ของคุณเมื่อคุณล็อกอิน)
system->pref->startup applications
ไม่สามารถพบได้ในหรือใน/etc/init/
~/.config/upstart
ดังนั้นแอพพลิเคชั่นเริ่มต้นจะถูกกำหนดไว้ที่ไหน?
วิธีหนึ่งคือการเพิ่มงาน @reboot cron :
crontab -e
จะช่วยให้คุณแก้ไข cron ของคุณการเพิ่มบรรทัดแบบนี้ลงไป:
@reboot /path/to/script
จะรันสคริปต์นั้นเมื่อคอมพิวเตอร์บูทขึ้น
@reboot
คำหลักคือเคล็ดลับที่ดีเพราะมันไม่เป็นที่รู้จักกันอย่างแพร่หลาย
man 5 crontab
กล่าวว่า@reboot
จะดำเนินการเมื่อเริ่มต้น (เมื่อ cron daemon เริ่มต้น)
rc.local
เนื่องจากระบบดูเหมือนว่าการติดตั้งเพิ่มเติมโดยจุดนี้ (เส้นทาง, ฯลฯ ) มันเป็นสิ่งที่แปลกว่ามันเป็นเรื่องยากมากที่จะเรียกสิ่งที่หลังจากการเริ่มต้นระบบ ..
วิธีการเกี่ยวกับการเพิ่มคำสั่งไปที่/etc/rc.local
? คุณจะต้องใช้การเข้าถึง sudo เพื่อแก้ไขไฟล์นี้
sudo nano /etc/rc.local
chmod 755 rc.local
งานได้และเพิ่ม#!/bin/bash
ในบรรทัดแรก
ในการเรียกใช้ (สั้น) 1คำสั่งที่เริ่มต้นใช้systemd
คุณสามารถใช้หน่วย systemd OneShot
ประเภท ตัวอย่างเช่นสร้าง/etc/systemd/system/foo.service
ที่มี:
[Unit]
Description=Job that runs your user script
[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
จากนั้นเรียกใช้:
sudo systemctl daemon-reload
sudo systemctl enable foo.service
โดยพื้นฐานแล้วนี่เป็นเพียงการแปลงงานพุ่งพรวดทั่วไปเป็น systemd หนึ่ง (ดูที่Systemd สำหรับผู้ใช้พุ่งพรวด )
คุณสามารถเรียกใช้หลายคำสั่งจากไฟล์บริการเดียวกันโดยใช้หลายExecStart
บรรทัด:
[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure
คำสั่งต้องถูกกำหนดด้วยพา ธ เต็มเสมอ หากคำสั่งใด ๆ ล้มเหลวส่วนที่เหลือจะไม่ทำงาน A -
ก่อนที่พา ธ จะบอกให้ systemd ละเว้นสถานะการออกที่ไม่ใช่ศูนย์ (แทนที่จะพิจารณาว่าเป็นความล้มเหลว)
ที่เกี่ยวข้อง:
สำหรับเซสชันผู้ใช้คุณสามารถสร้าง systemd unit ~/.config/systemd
แทน สิ่งนี้จะทำงานได้กับ 16.04 เป็นต้นไป แต่ไม่ใช่ Ubuntu รุ่นก่อนหน้าที่มี systemd (เนื่องจากยังคงใช้ Upstart สำหรับเซสชันผู้ใช้) หน่วยเซสชันผู้ใช้สามารถควบคุมได้ด้วยคำสั่งเดียวกับบริการของระบบ แต่มี--user
ตัวเลือกเพิ่ม:
systemctl --user daemon-reload
systemctl --user status foo.service
โปรดทราบว่าแตกต่างจากการพุ่งพรวด systemd ไม่ได้เรียกใช้Exec*
คำสั่งผ่านเปลือก มันทำการขยายตัวแปรที่ จำกัด และคำสั่งหลาย ๆ คำสั่ง (คั่นด้วย;
) แต่มันเกี่ยวกับมันเท่าที่เชลล์มีลักษณะคล้ายกับเชลล์ สำหรับสิ่งที่ซับซ้อนมากขึ้นกล่าวว่าการเปลี่ยนเส้นทางหรือท่อห่อคำสั่งของคุณในหรือsh -c '...'
bash -c '...'
1ตรงข้ามกับภูตที่มีอายุยาวนาน
WantedBy
ใช้ที่นี่เช่นทำให้มันเริ่มต้นเมื่อmulti-user.target
ถึง คุณสามารถใช้Before
, After
, Requires
ฯลฯ ดูman systemd.unit
RemainAfterExit
ขึ้นอยู่กับบริการที่คุณเริ่มและพฤติกรรมที่ต้องการ ยกตัวอย่างเช่น/bin/df -h
<s> จะ </ s> RemainAfterExit=no
ควรจะมี
df
ความต้องการRemainAfterExit=no
นั้น ถ้าคุณต้องการที่จะดำเนินการคำสั่งซ้ำ ๆ systemctl start foo
ในแต่ละครั้งที่คุณเรียก
มีหลายวิธีในการรันคำสั่งโดยอัตโนมัติ:
พุ่งพรวด/etc/init
ระบบจะรันสคริปต์ทั้งหมดจากที่ที่มันพบว่าการกำหนดค่าในไดเรกทอรี สคริปต์เหล่านี้จะทำงานในระหว่างการเริ่มต้นระบบ (หรือตอบสนองต่อเหตุการณ์บางอย่างเช่นคำขอปิดระบบ) และเป็นสถานที่สำหรับเรียกใช้คำสั่งที่ไม่โต้ตอบกับผู้ใช้ เซิร์ฟเวอร์ทั้งหมดเริ่มทำงานโดยใช้กลไกนี้
คุณสามารถค้นหาคำแนะนำที่อ่านได้ที่: http://upstart.ubuntu.com/getting-started.htmlหน้าคนman 5 init
และman 8 init
ให้รายละเอียดทั้งหมดแก่คุณ
เชลล์สคริปต์ที่มีชื่อ.gnomerc
ในไดเรกทอรีบ้านของคุณจะได้รับแหล่งข้อมูลโดยอัตโนมัติทุกครั้งที่คุณเข้าสู่ระบบของ GNOME คุณสามารถใส่คำสั่งโดยพลการในนั้น; ตัวแปรสภาพแวดล้อมที่คุณตั้งไว้ในสคริปต์นี้จะเห็นได้โดยโปรแกรมใด ๆ ที่คุณเรียกใช้ในเซสชันของคุณ
โปรดทราบว่าเซสชั่นจะไม่เริ่มจนกว่า.gnomerc
สคริปต์จะเสร็จสิ้น ดังนั้นหากคุณต้องการเริ่มต้นโปรแกรมที่รันมานานบางโปรแกรมคุณจะต้องผนวก&
การเรียกใช้ของโปรแกรมเพื่อที่จะแยกออกจากการรันเชลล์
ตัวเลือกเมนูระบบ -> การตั้งค่า -> แอปพลิเคชั่นเริ่มต้นช่วยให้คุณกำหนดแอพพลิเคชั่นที่ควรเริ่มทำงานเมื่อเซสชันกราฟิกของคุณเริ่มต้น (Ubuntu มีคำสั่งค่อนข้างน้อย) และเพิ่มหรือลบ สิ่งนี้มีวัตถุประสงค์และขอบเขตเกือบเหมือนกันของ.gnomerc
สคริปต์ยกเว้นคุณไม่จำเป็นต้องรู้sh
ไวยากรณ์ (แต่คุณไม่สามารถใช้sh
โครงสร้างการเขียนโปรแกรมใด ๆ)
.gnomerc
ว่าจะทำงานก่อนที่จะโหลด Unity และStartup Applications
จะทำงานหลังจากโหลด Unity ฉันต้องเรียกใช้โปรแกรมที่อยู่บนแถบเมนูของ Unity และมันสร้างความแตกต่างอย่างมากในกรณีนี้!
sudo update-rc.d myscript.sh defaults
โดยที่ /etc/init.d/myscript.sh เป็นสคริปต์ของคุณและจะรันเมื่อเริ่มต้น
$HOME/.config/autostart
.desktop
ไฟล์สามารถใส่ที่นี่ซึ่งจะถูกดำเนินการเมื่อเริ่มต้นตัวอย่างตัวอย่างสำหรับ.desktop
ไฟล์:
วาง.desktop
ไฟล์ต่อไปนี้$HOME/.config/autostart
และกำหนดchmod +x
:
[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script
ที่นี่"</path/to/script>"
จะถูกแทนที่ด้วยเส้นทางไปยังของคุณscript.sh
(มักจะแนะนำให้/usr/local/bin
สิ่งที่สามารถดำเนินการโดยคำสั่งโดยตรงว่าmyscript
แทนที่ด้วย"</path/to/script>"
)
ตัวอย่างของ script.sh
:
#!/bin/bash
<commands to be executed>
exit
ผลลัพธ์:
.desktop
ไฟล์จะถูก$HOME/.config/autostart
เรียกใช้จากที่เรียกใช้สคริปต์โดยExec=
ดังนั้นคุณสามารถเรียกใช้เชลล์สคริปต์ที่คุณต้องการเมื่อเริ่มต้น!
สำหรับสิ่งง่ายๆคุณสามารถเพิ่มคำสั่งได้ System-> Preferences-> Sessions ที่ชี้ไปยังตำแหน่งของสคริปต์ของคุณ
หรือคุณสามารถเพิ่มเข้าไปใน /etc/init.d/rc.local หรือทำให้พุ่งพรวดงานถ้าเป็นมากขึ้นในระดับต่ำสิ่ง
ลองดูที่https://help.ubuntu.com/community/UbuntuBootupHowtoสำหรับข้อมูลเพิ่มเติม
cron
คำตอบที่นำมาใช้ต่างจากการโหวตสูงสุดคำตอบนี้ยังคงใช้ cron
แต่ใช้วิธีที่แตกต่างจากคำตอบที่ได้รับการโหวตสูงสุด ใช้งานได้ตั้งแต่ Ubuntu 16.04 แต่อาจรองรับเร็วกว่านี้มาก ฉันเพิ่งเริ่มใช้cron
งานเมื่อคอมพิวเตอร์บูทตั้งแต่ 16.04
cron
ทำงานไหร่ในความคิดเห็นมีคนถามว่า "พวกเขาจะทำงานเมื่อไหร่" คุณสามารถบอกได้ใน syslog / journalctl:
$ journalctl -b | grep cron
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)
Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[985]: (root) CMD ( /usr/local/bin/cron-reboot-cycle-grub-background)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root
สิ่งหนึ่งที่ควรทราบคือcron
สามารถส่งอีเมลถึงคุณสถานะของงานที่เรียกใช้และ@reboot
งานที่ดำเนินการเพื่อผู้จัดการเครือข่ายและอีเมลก่อนหน้านี้จะไม่ทำงานจนกว่าคุณจะใส่sleep
คำสั่งลงในสคริปต์
ใส่สคริปต์ของคุณในไดเรกทอรี/etc/cron.d
:
$ ll /etc/cron.d
total 44
drwxr-xr-x 2 root root 4096 Nov 26 19:53 ./
drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../
-rw-r--r-- 1 root root 244 Dec 28 2014 anacron
-rw-r--r-- 1 root root 148 Feb 18 2017 cycle-grub-background
-rw-r--r-- 1 root root 138 Mar 5 2017 display-auto-brightness
-rw-r--r-- 1 root root 460 Nov 26 19:53 nvidia-hdmi-sound
-rw-r--r-- 1 root root 102 Feb 9 2013 .placeholder
-rw-r--r-- 1 root root 224 Nov 19 2016 touch-vmlinuz
-rw-r--r-- 1 root root 700 Aug 5 11:15 turn-off-hyper-threading
ต่อไปนี้เป็นสคริปต์บางส่วนที่ฉันได้ตั้งค่าให้เรียกใช้ในการบู๊ตแต่ละครั้ง:
$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot root /usr/local/bin/cron-reboot-cycle-grub-background
$ cat /etc/cron.d/touch-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot root touch "/boot/vmlinuz-"`uname -r`
@reboot
หลักของคำตอบที่ได้รับการโหวตมากและคำตอบของคุณจะยังคงมี
crontab -e
ซึ่งบางคนคิดว่าเป็นหนึ่งในศิลปะสีดำเนื่องจากอินเทอร์เฟซคล้ายเสียงเรียกเข้า ในทางกลับกันคำตอบนี้อาจดึงดูดผู้ที่สมองมีสายในทางที่แน่นอน เราทุกคนไม่ได้หล่อจากแม่พิมพ์เดียวกัน จากนั้นอีกครั้งคำตอบนี้มีการลงคะแนนเสียงหนึ่งครั้งดังนั้นเราจะให้ประชาธิปไตยเรียนรู้
crontab -e
แสดงความทรงจำเกี่ยวกับดอกจัน ("*") เป็นเวลาหลายนาทีชั่วโมง ฯลฯ ที่ฉันพบเสมอฉันจำเป็นต้องมีคำแนะนำของ Google สำหรับ ฉันยังพบว่าการใช้งาน/etc/cron.d
และ/etc/cron.daily
การเลือกของฉัน โดยเฉพาะอย่างยิ่งตั้งแต่มันสะท้อน/etc/udev/rules.d
และ/etc/systemd/system-sleep
วิธีการ ดูเหมือนว่าจะเป็นแบบที่ดี
คุณควรใช้พุ่งพรวดสำหรับเรื่องนี้ การพุ่งพรวดใช้สำหรับกระบวนการ Ubuntu ที่เริ่มโดยอัตโนมัติ มันเป็นโซลูชันที่ได้รับการปรับปรุงเช่นสคริปต์ System-V init.d แบบเก่า นอกจากนี้ยังช่วยให้คุณสามารถวางข้อกำหนดเบื้องต้นในการเริ่มต้นสคริปต์ของคุณ (เช่นคุณต้องการให้เครือข่ายทำงานหรือไม่เป็นต้น)