วิธีการเรียกใช้สคริปต์ในการเริ่มต้นขึ้น?


520

ฉันจะเรียกใช้สคริปต์โดยอัตโนมัติเมื่อ Ubuntu เริ่มทำงานได้อย่างไรฉันจึงไม่ต้องเรียกใช้สคริปต์ด้วยตนเองหลังจากเริ่มทำงาน


3
หากใครบางคนสามารถแสดงทั้งเมื่อและที่ไหนที่จะน่ากลัว ผมพูดนี้เพราะฉันรู้ว่ามีอย่างน้อย 2 วิธีในการเริ่มสคริปต์ที่จะยิงก่อนที่จะใช้งานอื่น ๆ ที่ได้รับการเริ่มต้น (เช่น X11)
Buttink

1
กระทู้คำตอบทั้งหมดนี้เป็นระเบียบ รูปแบบ Stack Exchange ดูเหมือนจะไม่เหมาะที่สุดสำหรับคำถามนี้
Gabriel Fair

1
จริงๆแล้วมันค่อนข้างสนุกสนาน จะมีวิธีต่างกันกี่วิธี?
devios1

คำตอบ:


206

ทั้งนี้ขึ้นอยู่กับสิ่งที่จัดเรียงของสคริปต์ที่คุณต้องทำงาน .. สำหรับการบริการและชอบที่คุณควรใช้พุ่งพรวด แต่สำหรับสคริปต์ผู้ใช้ควรเรียกใช้งานเป็นสคริปต์เซสชันโดย gnome ดูที่ระบบ> การตั้งค่า> แอปพลิเคชันเริ่มต้น

ในบันทึกด้านข้างหากคุณต้องการให้สคริปต์บางตัวทำงานในการล็อกอินของเทอร์มินัลคุณสามารถเพิ่มสคริปต์เหล่านั้นลงในไฟล์. bash_loginในโฮมไดเร็กตอรี่ของคุณได้

สำหรับ 14.04 ขึ้นไป

คำสั่งง่าย ๆ (คำสั่งที่ไม่ต้องการให้ทำงาน) สามารถใช้งาน Upstart เช่น:

start on startup
task
exec /path/to/command

บันทึกสิ่งนี้ใน.confไฟล์เป็น/etc/init(หากคุณต้องการให้มันทำงานเป็นรูทเมื่อระบบบูทขึ้น) หรือใน~/.config/upstart(หากคุณต้องการให้มันทำงานในฐานะผู้ใช้ของคุณเมื่อคุณล็อกอิน)


58
พิจารณาว่า SO และ StackExchange ทำงานอย่างไรคุณช่วยยกตัวอย่างสคริปต์ที่ก้าวล้ำและที่ที่จะวางไว้ นั่นจะทำให้คำตอบนี้ดีขึ้นมาก ลิงก์ของคุณบอกว่ามันไม่ได้รับการดูแลรักษาและดูตำราอาหารพุ่งพรวดซึ่งเป็น huuuge ฉันไม่มีความคิดที่จะเริ่มต้นมากเกินไป
Ehtesh Choudhury

2
ถ้าฉันต้องการรันคำสั่งในฐานะรูท
dopatraman

1
@dopatraman คำตอบระบุว่ากระบวนการทั้งหมดที่มีสิ่งนี้ถูกเรียกใช้เป็นรูต
AStopher

4
โปรดอัปเดตคำตอบนี้เพื่ออธิบายสิ่งที่ต้องทำในระบบที่รัน systemd แทนที่จะเป็นคนธรรมดา (Ubuntu 15.04+)

3
คำตอบนี้ไม่สมเหตุสมผลกับฉัน การใช้งานที่ระบุไว้ในsystem->pref->startup applicationsไม่สามารถพบได้ในหรือใน/etc/init/ ~/.config/upstartดังนั้นแอพพลิเคชั่นเริ่มต้นจะถูกกำหนดไว้ที่ไหน?
Blauhirn

553

วิธีหนึ่งคือการเพิ่มงาน @reboot cron :

  1. วิ่งcrontab -eจะช่วยให้คุณแก้ไข cron ของคุณ
  2. การเพิ่มบรรทัดแบบนี้ลงไป:

    @reboot /path/to/script
    

    จะรันสคริปต์นั้นเมื่อคอมพิวเตอร์บูทขึ้น


85
@rebootคำหลักคือเคล็ดลับที่ดีเพราะมันไม่เป็นที่รู้จักกันอย่างแพร่หลาย
jathanism

12
ดี ความคิดใด ๆว่าเมื่อนี้เป็นต้นเหตุ?
Oli

2
ดังนั้น ... สิ่งนี้จะไม่ทำงานหากฉันสูญเสียพลังงานและพีซีจะเปิดอีกครั้งเมื่อพลังงานกลับคืนมา?
Mike Wills

18
@siamii: man 5 crontabกล่าวว่า@rebootจะดำเนินการเมื่อเริ่มต้น (เมื่อ cron daemon เริ่มต้น)
jfs

9
นี่มันเจ๋งมาก. จนถึงตอนนี้ดูเหมือนจะดีกว่าrc.localเนื่องจากระบบดูเหมือนว่าการติดตั้งเพิ่มเติมโดยจุดนี้ (เส้นทาง, ฯลฯ ) มันเป็นสิ่งที่แปลกว่ามันเป็นเรื่องยากมากที่จะเรียกสิ่งที่หลังจากการเริ่มต้นระบบ ..
คาร์ทิค T

161

วิธีการเกี่ยวกับการเพิ่มคำสั่งไปที่/etc/rc.local? คุณจะต้องใช้การเข้าถึง sudo เพื่อแก้ไขไฟล์นี้

sudo nano /etc/rc.local

19
คำตอบนี้โดยตรงมากที่สุดคำถาม: วิธีการรันสคริปต์บางอย่างเมื่อระบบของคุณบูท upstart ทำงานที่ซับซ้อนมากขึ้น: เริ่มกระบวนการ daemon
Dogweather

1
ดังนั้นคนธรรมดาเริ่มกระบวนการ daemon ในขณะที่ /etc/rc.local เริ่มสคริปต์ทุบตี?
Donato

5
ควรเป็น? วันนี้ใช้ไม่ได้แล้วใช่ไหม
DaVince

4
ทำงานร่วมกับ Ubuntu 17.04 systemd
qodeninja

3
โปรดทราบว่าหากคุณสร้างไฟล์นี้ด้วยตัวเอง (เหมือนที่ฉันทำ) คุณจะต้องเปลี่ยนไฟล์เป็นไฟล์ที่เรียกใช้chmod 755 rc.localงานได้และเพิ่ม#!/bin/bashในบรรทัดแรก
psitae

77

สำหรับ 15.04 และใหม่กว่า:

ในการเรียกใช้ (สั้น) 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ตรงข้ามกับภูตที่มีอายุยาวนาน


เป็นไปได้หรือไม่ที่จะกำหนดลำดับความสำคัญให้กับงาน? หรือระบุว่าขึ้นอยู่กับบริการอื่นที่จะเริ่มต้นก่อน
r3wt

1
@ r3wt ใช่มีหลายวิธีที่จะทำเช่นนั้น WantedByใช้ที่นี่เช่นทำให้มันเริ่มต้นเมื่อmulti-user.targetถึง คุณสามารถใช้Before, After, Requiresฯลฯ ดูman systemd.unit
Muru

@PerlDuck ไม่ได้เป็นเพียงสิ่งเดียวที่มันขาด ขอบคุณ!
muru

ไม่เป็นไร - Btw RemainAfterExitขึ้นอยู่กับบริการที่คุณเริ่มและพฤติกรรมที่ต้องการ ยกตัวอย่างเช่น/bin/df -h<s> จะ </ s> RemainAfterExit=noควรจะมี
PerlDuck

@PerlDuck ไม่มีอะไรอยู่ในdfความต้องการRemainAfterExit=noนั้น ถ้าคุณต้องการที่จะดำเนินการคำสั่งซ้ำ ๆ systemctl start fooในแต่ละครั้งที่คุณเรียก
muru

71

มีหลายวิธีในการรันคำสั่งโดยอัตโนมัติ:

  1. พุ่งพรวด/etc/initระบบจะรันสคริปต์ทั้งหมดจากที่ที่มันพบว่าการกำหนดค่าในไดเรกทอรี สคริปต์เหล่านี้จะทำงานในระหว่างการเริ่มต้นระบบ (หรือตอบสนองต่อเหตุการณ์บางอย่างเช่นคำขอปิดระบบ) และเป็นสถานที่สำหรับเรียกใช้คำสั่งที่ไม่โต้ตอบกับผู้ใช้ เซิร์ฟเวอร์ทั้งหมดเริ่มทำงานโดยใช้กลไกนี้

    คุณสามารถค้นหาคำแนะนำที่อ่านได้ที่: http://upstart.ubuntu.com/getting-started.htmlหน้าคนman 5 initและman 8 initให้รายละเอียดทั้งหมดแก่คุณ

  2. เชลล์สคริปต์ที่มีชื่อ.gnomercในไดเรกทอรีบ้านของคุณจะได้รับแหล่งข้อมูลโดยอัตโนมัติทุกครั้งที่คุณเข้าสู่ระบบของ GNOME คุณสามารถใส่คำสั่งโดยพลการในนั้น; ตัวแปรสภาพแวดล้อมที่คุณตั้งไว้ในสคริปต์นี้จะเห็นได้โดยโปรแกรมใด ๆ ที่คุณเรียกใช้ในเซสชันของคุณ

    โปรดทราบว่าเซสชั่นจะไม่เริ่มจนกว่า.gnomercสคริปต์จะเสร็จสิ้น ดังนั้นหากคุณต้องการเริ่มต้นโปรแกรมที่รันมานานบางโปรแกรมคุณจะต้องผนวก&การเรียกใช้ของโปรแกรมเพื่อที่จะแยกออกจากการรันเชลล์

  3. ตัวเลือกเมนูระบบ -> การตั้งค่า -> แอปพลิเคชั่นเริ่มต้นช่วยให้คุณกำหนดแอพพลิเคชั่นที่ควรเริ่มทำงานเมื่อเซสชันกราฟิกของคุณเริ่มต้น (Ubuntu มีคำสั่งค่อนข้างน้อย) และเพิ่มหรือลบ สิ่งนี้มีวัตถุประสงค์และขอบเขตเกือบเหมือนกันของ.gnomercสคริปต์ยกเว้นคุณไม่จำเป็นต้องรู้shไวยากรณ์ (แต่คุณไม่สามารถใช้shโครงสร้างการเขียนโปรแกรมใด ๆ)


11
3) "นี่มีวัตถุประสงค์และขอบเขตเกือบเหมือนกันของสคริปต์. gomerc" ยกเว้น.gnomercว่าจะทำงานก่อนที่จะโหลด Unity และStartup Applicationsจะทำงานหลังจากโหลด Unity ฉันต้องเรียกใช้โปรแกรมที่อยู่บนแถบเมนูของ Unity และมันสร้างความแตกต่างอย่างมากในกรณีนี้!
Guy บราซิลนั่น

1
@ ruda.almeida ขอบคุณที่ชี้ให้เห็น คำตอบนั้นเขียนขึ้นในช่วงก่อนวันสามัคคี
Riccardo Murri

1
sudo update-rc.d myscript.sh defaultsโดยที่ /etc/init.d/myscript.sh เป็นสคริปต์ของคุณและจะรันเมื่อเริ่มต้น
Dan Dascalescu

27
$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=

ดังนั้นคุณสามารถเรียกใช้เชลล์สคริปต์ที่คุณต้องการเมื่อเริ่มต้น!


18

สำหรับสิ่งง่ายๆคุณสามารถเพิ่มคำสั่งได้ System-> Preferences-> Sessions ที่ชี้ไปยังตำแหน่งของสคริปต์ของคุณ

หรือคุณสามารถเพิ่มเข้าไปใน /etc/init.d/rc.local หรือทำให้พุ่งพรวดงานถ้าเป็นมากขึ้นในระดับต่ำสิ่ง

ลองดูที่https://help.ubuntu.com/community/UbuntuBootupHowtoสำหรับข้อมูลเพิ่มเติม


7

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`

1
มีหลายวิธีที่จะเพิ่ม cronjobs @rebootหลักของคำตอบที่ได้รับการโหวตมากและคำตอบของคุณจะยังคงมี
muru

วิธีการอื่นสำหรับการเพิ่ม crontabs ควรโพสต์ไปที่askubuntu.com/q/2368/158442ซึ่งมีความชัดเจนเกี่ยวกับการเพิ่มงาน Cron
muru

1
ฉันขอแตกต่าง แก่นแท้ของคำตอบในคำถามใช้ประโยชน์crontab -eซึ่งบางคนคิดว่าเป็นหนึ่งในศิลปะสีดำเนื่องจากอินเทอร์เฟซคล้ายเสียงเรียกเข้า ในทางกลับกันคำตอบนี้อาจดึงดูดผู้ที่สมองมีสายในทางที่แน่นอน เราทุกคนไม่ได้หล่อจากแม่พิมพ์เดียวกัน จากนั้นอีกครั้งคำตอบนี้มีการลงคะแนนเสียงหนึ่งครั้งดังนั้นเราจะให้ประชาธิปไตยเรียนรู้
WinEunuuchs2Unix

2
โอ้ได้โปรด. คุณและฉันต่างก็รู้ว่าตัวแก้ไขสามารถเปลี่ยนแปลงได้
muru

@muru ใช่อาจเป็นเพราะคุณสอนฉันและฉันได้เรียนรู้ที่จะเปลี่ยนโปรแกรมแก้ไขเป็นบางอย่างเช่น nano หรือ CLI อื่น ๆ แต่ฉันอยู่ในค่าย gedit นอกจากนี้ยังcrontab -eแสดงความทรงจำเกี่ยวกับดอกจัน ("*") เป็นเวลาหลายนาทีชั่วโมง ฯลฯ ที่ฉันพบเสมอฉันจำเป็นต้องมีคำแนะนำของ Google สำหรับ ฉันยังพบว่าการใช้งาน/etc/cron.dและ/etc/cron.dailyการเลือกของฉัน โดยเฉพาะอย่างยิ่งตั้งแต่มันสะท้อน/etc/udev/rules.dและ/etc/systemd/system-sleepวิธีการ ดูเหมือนว่าจะเป็นแบบที่ดี
WinEunuuchs2Unix

5

คุณควรใช้พุ่งพรวดสำหรับเรื่องนี้ การพุ่งพรวดใช้สำหรับกระบวนการ Ubuntu ที่เริ่มโดยอัตโนมัติ มันเป็นโซลูชันที่ได้รับการปรับปรุงเช่นสคริปต์ System-V init.d แบบเก่า นอกจากนี้ยังช่วยให้คุณสามารถวางข้อกำหนดเบื้องต้นในการเริ่มต้นสคริปต์ของคุณ (เช่นคุณต้องการให้เครือข่ายทำงานหรือไม่เป็นต้น)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.