Ubuntu'da oturumu kapat / yeniden başlat / kapat üzerine bir komut dosyası yürü


30

.shOturumu kapattığınızda bash kullanarak ve Ubuntu'nun kapatılmasını kullanarak bir dosyayı çalıştırmak istiyorum . İnternette yukarı ve aşağı arama yaptım ve yalnızca KDE ve GNOME için düzeltmeler buldum. Betik basittir, sadece "logoff / shutdown" dosyasına kod satırını ekleyip ekleyemeyeceğimi veya başka bir betik içerisinde referans göstermem gerekip gerekmediğini bilmem gerekiyor.


1
/Etc/rc0.d /etc/rc6.d dizinindeki /etc/init.d içindeki yürütülebilir dosyalara sembolik bağlantılar ekleyin
Yine Başka Bir Kullanıcı

2
Lütfen güncellenmiş yanıtı kabul etmeyi (kullanarak systemd) düşünün, böylece insanlar bunu en üstte göreceklerdir.
Jonathan Y.

Yanıtlar:


18

Çıkışta bir komut dosyası çalıştırmak için:

Aşağıdaki satırı ekleyin:

session-cleanup-script=/path/to/script

içinde /etc/lightdm/lightdm.confdosyaya.

Bu değişikliğin geçerli olması için lightdm'yi yeniden başlatmanız gerekir. Bunu yapmak için Ctrl+ Alt+ kullanarak tty1'e F1girin, kullanıcı adınız ve şifrenizle giriş yapın ve aşağıdaki komutu çalıştırın:

sudo service lightdm restart

Not: Grafiksel oturuma geçmek için Ctrl+ + Alttuşlarını F7kullanın

Yeniden başlatıldıktan sonra bir komut dosyasını çalıştırmak için:

  1. Komut dosyasını yerleştir /etc/rc0.d
  2. Çalıştırılabilir yap: sudo chmod +x K99_script
  3. Notlar:
    • Bu dizindeki komut dosyaları alfabetik sırayla yürütülür.
    • Komut dosyanızın adı K99doğru zamanda çalıştırılmalı.

Kapatma sırasında bir komut dosyasını çalıştırmak için:

  1. Komut dosyasını yerleştir /etc/rc6.d
  2. Çalıştırılabilir yap: sudo chmod +x K99_script
  3. Notlar:
    • Bu dizindeki komut dosyaları alfabetik sırayla yürütülür.
    • Komut dosyanızın adı K99doğru zamanda çalıştırılmalı.

Kaynaklar:


4
O var konvansiyonel ile başlayan komut dosyalarını isim K'öldür' ve S'Başlat' için.
kiri

Komut dosyası sudo ayrıcalıklarına ihtiyaç duyarsa? Söyleyebileceğim kadarıyla, / etc / rc6.d scriptleri kullanıcı olarak çalıştırılıyor ve gksudo kullanamıyor.
Urhixidur

1
14.04 ile benim için çalışmıyor mu, herhangi bir değişiklik veya belirtilmemiş önemli bir gerçek var mı?
tomasb

2
K99 tavsiyesi, bazı veriler kaydetmek istiyorsa, kapatma işleminden sonra yeniden başlatma için iyi değildir. Çünkü UNmount BİRDEN SONRA VE K komut dosyasını devre dışı bırakmak için kullanılır (bkz. /Etc/rcS.d/README), başlangıç ​​için S'yi kullanın ve bağlantı kesilmeden önce yerleştirin bootup için betiğinizi yerleştirdikten sonra yerleştiriniz, bunun üzerine sıkışmıştır çünkü bu yanlış bilgilendirme, S ile ilk harf olarak çözülmüştür
tomasb

6
Bu çok yanlıştır: i) script isimlerinin K, 0, 1 ve 6 Sçalışma seviyeleri ve 2, 3, 4 ve 5 çalışma seviyeleri için başlaması gerekir ; ii) betiği çağırmanıza gerek yoktur K99_foo, sayı yalnızca kodların çalıştırılma sırasını belirler. En son çalıştırılmasını istiyorsanız, diğerlerinden daha büyük bir tane seçmeniz gerekir; iii) Runlevel 0 yeniden başlatma için değil! ; Kapatma için. 6 yeniden başlatmak içindir. iv) senaryoların /etc/rcN.drehberlerde işi yoktur . Bunun yerine onların içinde olmaları /etc/init.dve buna bağlı olmaları gerekir /etc/rcN.d.
terdon

14

Systemd ile nasıl yapılır

Haziran 2016'dan sonra bu konuyu bulursanız, Ubuntu ve Mint dahil türevleri, sistemin başlatılmasını ve kapatılmasını kontrol etmek için systemd'yi kullanacaktır. Eski yaklaşımla ilgili problemlerim vardı, bu yüzden sistem yolu araştırıldı.

Systemd ile, aşağıdaki şablonları kullanarak scriptlerinizi çağırmak için bir veya iki dosya oluşturun ve bir komutu çalıştırın. Basit.


GUI Sürümü

Öncelikle , başlangıçta ve / veya kapanışta çalıştırmak istediğiniz komut dosyalarını oluşturun. .Scopening_atstart ve .scfullcopy_atend 'ı oluşturdum.

Sonra her ikisinin de çalıştırılabilir olduğundan emin olun, dosyayı sağ tıklayın, özellikleri seçin ve izinler altında, dosyayı bir program olarak yürütmeye izin ver seçeneğinin işaretli olduğundan emin olun.

Oluşturduğum iki dosya bir ramdisk içeriğini dolduruyor ve kaydediyor. Ayrıca, servisin çalıştığını kanıtlamak için giriş dizinimde bir dosya oluşturuyorlar. Şeklindeydiler:

#!/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

Daha sonra dosya yöneticimi root olarak açtım, açtım /etc/systemd/systemve bir dosya açıldı startup.service ve bir dosya save-ramdisk.service. Açıkçası kendi adınızı seçebilirsiniz ve genel adlar johns_start.service adlı bir başlangıç ​​dosyası ve johns_shutdown.service adlı bir kapatma dosyası içerebilir. Sadece mevcut servis adlarını seçmeyin.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

ve

[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

Çalıştırılabilir betiğinizin tam yolunu benim için değiştirerek aynı hizmet dosyalarını kullanabilirsiniz.

Son olarak , her biri systemctl komutunu çalıştırınız, your_files_name (ancak sonek servisi olmadan). Yani benim birincisiydisystemctl enable startup

Hizmetleri başlatmak için bilgisayarı bir kez yeniden başlatın. Start hizmeti, sistem kullanıcı çok kullanıcılı hedefine her girdiğinde ve çok kullanıcılı hedefinden çıktığında stop servisine yürütülür. Farklı aktivasyon koşullarına sahip alternatif servis dosyaları aşağıda açıklanacaktır.


CLI (Komut Satırı) Sürümü

Bu açıklama / home / john yerine home dizininizden çalıştığınızı, gerektiğinde sudo kullandığını ve vim veya svim yazdığım bir editör seçimini yaptığınızı varsayar.

İlk satırda başlatma ve kapatma kabuğu komut dosyaları oluşturun ve #!/bin/shbunları çalıştırılabilir hale getirin chmod +x my_new_filename.

Yukarıdaki gibi iki dosya oluşturun veya bu örnekte, başlatma ve kapatma görevlerini işlemek için bir dosya oluşturun. Komut dizilerini ev dizinimde çalıştıracağım ama @ don_crissti Stack Exchange'de bazı alternatifler gösterdi.

svim /etc/systemd/system/start_and_stop.service

ve dosya içeriğine kopyalayın:

[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

Ardından Hizmeti şu komutla etkinleştirin :

systemctl enable start_and_stop

ve servislerin aktif olacağı sisteminizi yeniden başlatınız. Komutlar systemctl is-enabled start_and_stopve systemctl is-active start_and_stopyeni hizmetlerinizin izlenmesinde kullanılabilir.


Kapatma için Tetikleme Koşullarını Değiştirme

Her şeyden önce dosyalar, komut dosyalarını çalıştırmaya başlamak için çok kullanıcılı ortamın açılmasını veya kapatılmasını kullanır. Aşağıdaki dosya, komut dosyalarını başlatmak için dört olası kapatma işleminin başlangıcını kullanır. Önce satırına + WantedBy satırına hedefler ekleme veya kaldırma, daha ince ayrımlar yapmanıza olanak sağlar:

Bu dosya @Matthias tarafından Unix ve Linux'ta bir cevapta önerildi, ancak bir Kurulum bölümü ekleyene kadar çalışmasını sağlayamadım.

Yine komut dosyasını düzenleyin /etc/systemd/service/ve kullanarak etkinleştirin systemctl enable your_file_name. Hedefleri değiştirdiğimde systemclt disable file_namekomutu kullandım ve sonra onu hedef dizinlere bağlayan yeniden etkinleştirdim. Yeniden başlattığınızda servis çalışacaktır.

[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

1
Göreviniz doğru olsa da, bu tür adımların sistemlerde nasıl uygulanabileceğine dair bir örnek ekleyerek iyileştirmenizi öneririm. Lütfen yayınınızı düzenledikten sonra bana haber verin. Teşekkür ve AskUbuntu
Sergiy Kolodyazhnyy

Merhaba Serg, bağlantılı yazılanlar gibi örnekleri mi kastediyorsunuz veya aklınızda başka bir şey mi var? İkincisi, başka bir SO kullanıcısı ile iletişim kurmak için bir mekanizma bulamadığımdan nasıl "size bildireceğimi" bilmiyorum.
John 9631,

Evet, diğer postanızdakilerle aynı örneği verebilirsiniz. Sadece "diğer bağlantıya git" demek çok iyi değil ve cevabınızı tembel gösteriyor. Ayrıca, örneğin @Serg için, kullanıcı adı önce @ bir böylece kullanıcı kullanımı temas etmek için
Sergiy Kolodyazhnyy

Çok gelişmiş. Çok iyi, iyi iş çıksın!
Sergiy Kolodyazhnyy

1
man systemd.unitKullanıcıya göre oluşturulan dosyalar $XDG_CONFIG_HOME/systemd/userve diğer yerel kullanıcı konumlarına yerleştirilebilir
Antonios Hadjigeorgalis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.