Kapatmadan önce bir komut dosyası çalıştır [çoğalt]


3

Bu sorunun burada zaten bir cevabı var:

Bilgisayarımı her kapattığımda her zaman bir komut dosyası çalıştırmak istiyorum. Bunun belki de bir kopya olduğunu biliyorum ve gerçekten pek çok benzer konu okudum ama ya cevap artık çalışmıyor ya da cevabın nasıl çalıştığını göremiyorum.

Bu elmanın kullanmamı istediğini zaten anladım launchd. Diğer çözümlerin çoğu artık çalışmıyor.

Böylece bu cevabı buldum, ancak launchdsistem başladığında gördüğüm kadarıyla her şeyi yapıyor. Aşağıdaki kodu kopyalayacağım

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>boot.shutdown.script.name</string>

<key>ProgramArguments</key>
<array>
  <string>SCRIPT_PATH/boot-shutdown.sh</string>
</array>

<key>RunAtLoad</key>
<true/>

<key>StandardOutPath</key>
<string>LOG_PATH/boot-shutdown.log</string>

<key>StandardErrorPath</key>
<string>LOG_PATH/boot-shutdown.err</string>

</dict>
</plist>

ve senaryo

#!/bin/bash
function shutdown()
{

  # INSERT HERE THE COMMAND YOU WANT EXECUTE AT SHUTDOWN OR SERVICE UNLOAD

  exit 0
}

function startup()
{

  # INSERT HERE THE COMMAND YOU WANT EXECUTE AT STARTUP OR SERVICE LOAD

  tail -f /dev/null &
  wait $!
}

trap shutdown SIGTERM
trap shutdown SIGKILL

startup;

Ne yazık launchdki, çok basit bir açıklama içeren bir ders yok . Örneğin, anahtar parantezlerin argümanları sadece bir şeyi tetikleyen dizelerden daha fazlasıdır, fakat hangi kelimelerin hangi eylemi tetiklediğinin bir listesini bulamıyorum.

Temel fikrini anlamak istiyorum launchd. Özellikle, sistemler başladığında ve sistemler kapatıldığında bir komut dosyası çalıştırmanın komutlarıdır.

Yanıtlar:


0

Sanırım, yaptığınız şeye farklı bir yaklaşımla yaklaşırım, ancak yine de önerim, istediğinizle karşılaştırıldığında biraz geçici bir çözüm.

Benim yaklaşımım, betiğinizi, kodun bir parçası olarak kapatmayı tetikleyecek şekilde ayarlamaktır. Diğer bir deyişle, Kapatma komut dosyasını tetiklemek yerine, komut dosyasını kapatma işlemini tetikleyin.

Bunun avantajı, isterseniz bunu normal kapatma seçeneğiniz olarak kullanabilirsiniz, ancak komut dosyanızı çalıştırmadan da kapatmanız gerekirse (örneğin, sorun giderme amacıyla birden fazla kez kapatmanız gerekiyorsa veya bir yükleme Mac'inizi vb. otomatik olarak kapatır.

Bu sizin için kabul edilebilir bir seçenek ise, ihtiyacınız olan Applescript kodu aşağıdaki gibidir:

tell application "Finder" to shut down

Başka bir deyişle, betiğiniz ne olursa olsun yukarıdaki kodu etkili bir şekilde eklemeniz gerekir.

Komut dosyanız istediğiniz gibi çalıştığında, onu çalıştıran bir Otomator Hizmeti oluşturacağım. Bu zorunlu değildir, ancak herhangi bir uygulamanın Uygulama menüsünden komut dosyanızı çalıştırabileceğiniz anlamına gelir . Ayrıca, tetiklemek için bir klavye kısayolu oluşturabileceğiniz anlamına gelir.

Bu seçeneklerden biri veya her ikisi de sizi ilgilendiriyorsa, aşağıya devam edin.

1. Automator kullanarak bir servis oluşturun.

  1. Otomatikleştiriciyi Başlat (genellikle Uygulamalar klasörünüzde bulunur)
  2. Dosyaya Git> Yeni
  3. Servis seçip Seç'e tıklayın.
  4. Açılan pencerenin sağ üst köşesinde, Servis açılır listesinden "Giriş yok" seçili olduğundan emin olun
  5. Emin olarak açılır listesini "Herhangi bir uygulama" gösteriyor
  6. Uzun listeyi içeren ikinci sütunda, "AppleScript Çalıştır" ı bulun ve üzerine çift tıklayın.
  7. Bu, sağ AppleScript Çalıştır penceresini ekleyecektir
  8. Şimdi, yerine Senaryonuzun ile (* Senaryonuz * buraya girilir)
  9. Hizmeti anlamlı bir ad kullanarak kaydedin (örn. ShutMeDown).

Artık aralarından hizmet (ve dolayısıyla, komut) çalıştırmak mümkün olmalıdır herhangi (vs, örneğin Bulucu> Hizmetler, Safari> Hizmetler, TextEdit> Hizmetler) Herhangi bir uygulama menü içinde Hizmetler listesine giderek uygulamadan ve sadece hizmet seçin yarattı.

Ayrıca olayları tetiklemek için bir klavye kısayolu belirlemek istiyorsanız, aşağıya devam edin.

2. Klavye kısayolu oluşturma

  1. Sistem Tercihleri> Klavye> Kısayollar'a gidin.
  2. Kenar çubuğundan Hizmetler'i seçin
  3. Hizmetinizi bulun (sağ taraftaki listede olacaktır)
  4. Servis adına çift tıklayarak bir kısayol ekleyin.
  5. Şimdi Sistem Tercihleri> Güvenlik ve Gizlilik> Gizlilik’e gidin.
  6. Kenar çubuğundan Erişilebilirlik'i seçin
  7. + İşaretini tıklayın (kilitliyse asma kilit kilidini açmanız gerekebilir)
  8. Otomatikleştirici ekleyin.
  9. Bulucu ekle (bunu bulmak için /System/Library/CoreServices/Finder.app adresine gitmeniz gerekir ).
  10. Sistem Tercihlerinizden çıkın.

Artık hizmeti çalıştırmak için klavye kısayolunu kullanabilmelisiniz (ve bu nedenle komut dosyanızı).

NOT: Ben farkındayım bazı kullanıcılar klavye kısayolları onlar bir hizmete atandım halde çalışmaya görünmüyor. Bu tamamen başka bir konudur, ancak bu sizin durumunuzda gerçekleşirse, en azından hizmeti kullandığınız herhangi bir uygulamanın içinden çalıştırabilirsiniz.

Bu yaklaşıma bir karar vermeye karar verirseniz, herhangi bir sorunuz / probleminiz varsa bana yorum yapmaktan çekinmeyin.


0

Şu ana kadar ne düşündüğümü söyleyeceğim:

Kapatmadan önce bu Çalıştırma komut dosyasında belirtildiği gibi logouthook, hedefi gerçekleştirmek için a kullanabilirsiniz . Ancak, elma desteğini durdurdu rc.shutdownve belki de aynısını yapacağız logouthook. Alternatif elma ise şu launchdanda çıkıştan hemen önce bir betiği çalıştırmama izin veren bir komut bulamadım.

launchda loginhookveya yerine kullanılabilir cronjobs. Bununla birlikte, bunun yerine onu kullanabilmeniz için bir geçici çözüm vardır logouthook. Çözüm zaten soruma gönderildi. Sadece nasıl çalıştığını söylemek istiyorum:

Aslında, bilgisayar başlatıldığında komut dosyası çalıştırılır, ancak trapkomut kapanma sinyalini bekler, böylece sinyal gönderildiğinde istenen fonksiyon çalıştırılır.


SIGKILLYakalabilir değil Senaryo hatalı.
fd0

hala çalışıyor. tamam bu demek ki bu satırı silebilirim :)
Nathanael Skrepek
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.