วิธีทำด้วย Systemd (ง่ายกว่า)
ตอนนี้ตัวแปร Ubuntu และมิ้นท์ได้ย้ายไปที่ systemd ฉันพบวิธีแก้ไขปัญหาเก่าของฉันตามที่กล่าวไว้ข้างต้นเป็นที่น่าพอใจน้อยลง ฉันค้นหาในเว็บเพื่อค้นหาวิธีใช้ systemd และลงเอยด้วยการรวมภูมิปัญญาของผู้อื่นและบันทึกไว้เป็นโพสต์บล็อกที่blogspot.com.auซึ่งมีบทช่วยสอนต่อไปนี้
ด้วย 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 เข้าสู่เป้าหมายผู้ใช้หลายคนและบริการหยุดเมื่อออกจากเป้าหมายผู้ใช้หลายคน ไฟล์บริการทางเลือกที่มีเงื่อนไขการเปิดใช้งานแตกต่างกันจะอธิบายไว้ด้านล่าง
คำสั่งที่มีประโยชน์เพิ่มเติม ได้แก่ :
systemctl is-enabled startup,
systemctl is-startup startup
systemctl ทำการรีสตาร์ท
สามารถดูเพิ่มเติมได้ที่การอ้างอิงข้างต้น
เวอร์ชันของ CLI (Command Line)
คำอธิบายนี้อนุมานว่าคุณทำงานจากโฮมไดเร็กตอรี่ของคุณแทนที่จะเป็น / home / john, ใช้ sudo ตามต้องการ, และตัวเลือกของบรรณาธิการที่ฉันเขียนเป็นกลุ่มหรือ svim
สร้างเชลล์สคริปต์เริ่มทำงานและปิดระบบด้วยบรรทัดแรก#!/bin/sh
และทำให้สามารถใช้งานchmod +x my_new_filename
ได้
สร้างสองไฟล์ดังกล่าวข้างต้นหรือในตัวอย่างนี้หนึ่งไฟล์เพื่อจัดการงานเริ่มต้นและปิด ผมจะรันสคริปต์ในไดเรกทอรีบ้านของฉัน แต่ @don_crissti แสดงให้เห็นทางเลือกบางอย่างที่กองแลกเปลี่ยน
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 สำหรับการปิดเครื่อง
ไฟล์ข้างต้นทั้งหมดใช้การเปิดหรือปิดของสภาพแวดล้อมที่มีผู้ใช้หลายคนเพื่อเริ่มการทำงานของสคริปต์ ไฟล์ด้านล่างใช้การเริ่มต้นกระบวนการปิดที่อาจเกิดขึ้นสี่ขั้นตอนเพื่อเริ่มต้นสคริปต์ การเพิ่มหรือลบเป้าหมายในบรรทัด Before + บรรทัด WantedBy จะช่วยให้คุณสร้างความแตกต่างที่ละเอียดยิ่งขึ้น:
ไฟล์นี้มีการเสนอในคำตอบที่สองของโพสต์นี้แต่ฉันไม่สามารถให้มันทำงานจนกว่าฉันจะเพิ่มส่วนการติดตั้ง
อีกครั้งแก้ไขสคริปต์ในและเปิดใช้งานได้โดยใช้/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