จะทำอย่างไรกับ systemd
หากคุณพบกระทู้นี้หลังจากเดือนมิถุนายน 2559 อูบุนตูและอนุพันธ์รวมถึงมิ้นท์จะใช้ systemd เพื่อควบคุมการเริ่มต้นและปิดระบบ ฉันมีปัญหากับวิธีการแบบเก่าดังนั้นค้นคว้าวิธี systemd
ด้วย systemd คุณสามารถสร้างหนึ่งหรือสองไฟล์เพื่อเรียกใช้สคริปต์ของคุณโดยใช้แม่แบบด้านล่างและดำเนินการคำสั่ง ง่าย
เวอร์ชัน GUI
ขั้นแรกให้สร้างสคริปต์ที่คุณต้องการเรียกใช้เมื่อเริ่มต้นและ / หรือปิดระบบ ฉันสร้าง. scopening_atstart และ. scfullcopy_atend
แล้วก็ตรวจสอบให้แน่ใจว่าไฟล์ทั้งสองนั้นสามารถเรียกทำงานได้โดยคลิกขวาที่ไฟล์เลือกคุณสมบัติและตรวจสอบให้แน่ใจว่าภายใต้การอนุญาตคุณได้ทำเครื่องหมายที่อนุญาตให้เรียกใช้ไฟล์ปฏิบัติการเป็นโปรแกรม
สองไฟล์ที่ฉันสร้างเติมและบันทึกเนื้อหาของ ramdisk พวกเขายังสร้างไฟล์ในโฮมไดเร็กตอรี่ของฉันเพื่อพิสูจน์ว่าบริการใช้งานได้ พวกเขาอยู่ในรูปแบบ:
#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time
จากนั้นฉันก็เปิดตัวจัดการไฟล์ในฐานะรูทเปิด/etc/systemd/system
และสร้างไฟล์ startup.service และไฟล์ save-ramdisk.service เห็นได้ชัดว่าคุณสามารถเลือกชื่อของคุณเองและชื่อทั่วไปอาจรวมถึงไฟล์เริ่มต้นชื่อ johns_start.service และไฟล์ปิดที่ชื่อ johns_shutdown.service อย่าเลือกชื่อบริการที่มีอยู่
[Unit]
Description=Startup Applications
[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart
[Install]
WantedBy=multi-user.target
และ
[Unit]
Description=Save Ramdisk to Wine drive C
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend
[Install]
WantedBy=multi-user.target
คุณสามารถใช้ไฟล์บริการเดียวกันแทนที่เส้นทางแบบเต็มของสคริปต์ที่เรียกใช้งานได้ของฉัน
ในที่สุดสำหรับแต่ละคนดำเนินการคำสั่ง systemctl เปิดใช้งาน your_files_name (แต่ไม่มีบริการต่อท้าย) ดังนั้นอันแรกของฉันคือsystemctl enable startup
รีบูทคอมพิวเตอร์หนึ่งครั้งเพื่อเริ่มบริการ บริการเริ่มต้นจะถูกดำเนินการเมื่อใดก็ตามที่ systemd เข้าสู่เป้าหมายผู้ใช้หลายคนและบริการหยุดเมื่อออกจากเป้าหมายผู้ใช้หลายคน ไฟล์บริการทางเลือกที่มีเงื่อนไขการเปิดใช้งานที่แตกต่างกันจะอธิบายไว้ด้านล่าง
เวอร์ชันของ CLI (Command Line)
คำอธิบายนี้อนุมานว่าคุณทำงานจากโฮมไดเร็กตอรี่ของคุณแทนที่จะเป็น / home / john, ใช้ sudo ตามต้องการ, และตัวเลือกแก้ไขที่ฉันเขียนเป็นกลุ่มหรือ svim
สร้างเริ่มต้นและเปลือกปิดสคริปต์ด้วยบรรทัดแรกและทำให้พวกเขาปฏิบัติการใช้#!/bin/sh
chmod +x my_new_filename
สร้างสองไฟล์ดังกล่าวข้างต้นหรือในตัวอย่างนี้หนึ่งไฟล์เพื่อจัดการงานเริ่มต้นและปิด ฉันจะใช้งานสคริปต์ในโฮมไดเร็กตอรี่ของฉัน แต่ @don_crissti แสดงทางเลือกบางอย่างที่ Stack Exchange
svim /etc/systemd/system/start_and_stop.service
และคัดลอกในเนื้อหาไฟล์:
[Unit]
Description=Run Scripts at Start and Stop
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands #your paths and filenames
ExecStop=/home/john/.shutdown_commands
[Install]
WantedBy=multi-user.target
จากนั้นเปิดใช้งานบริการด้วยคำสั่ง:
systemctl enable start_and_stop
และรีบูตระบบของคุณหลังจากที่บริการจะเปิดใช้งาน คำสั่งsystemctl is-enabled start_and_stop
และsystemctl is-active start_and_stop
สามารถใช้ในการตรวจสอบบริการใหม่ของคุณ
การเปลี่ยนเงื่อนไข Trigger สำหรับการปิดเครื่อง
ไฟล์ข้างต้นทั้งหมดใช้การเปิดหรือปิดของสภาพแวดล้อมที่มีผู้ใช้หลายคนเพื่อเริ่มการทำงานของสคริปต์ ไฟล์ด้านล่างใช้การเริ่มต้นกระบวนการปิดที่อาจเกิดขึ้นสี่ขั้นตอนเพื่อเริ่มต้นสคริปต์ การเพิ่มหรือลบเป้าหมายในบรรทัดก่อน + บรรทัด WantedBy จะช่วยให้คุณสร้างความแตกต่างที่ละเอียดยิ่งขึ้น:
ไฟล์นี้มีการเสนอในคำตอบที่ Unix & Linux โดย @Matthias แต่ฉันไม่สามารถเรียกใช้จนกว่าฉันจะเพิ่มส่วนการติดตั้ง
อีกครั้งแก้ไขสคริปต์ในและเปิดใช้งานได้โดยใช้/etc/systemd/service/
systemctl enable your_file_name
เมื่อฉันเปลี่ยนเป้าหมายฉันใช้systemclt disable file_name
คำสั่งแล้วเปิดใช้งานมันซึ่ง symlinked ไปยังไดเรกทอรีเป้าหมาย รีบูทและบริการจะทำงาน
[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
# executed before the target state is entered
# Also consider kexec.target
[Service]
Type=oneshot
ExecStart=/home/john/.my_script #your path and filename
[Install]
WantedBy=halt.target reboot.target shutdown.target