2012-03-01 24 views

cevap

29

Komut dosyasının otomatik olarak başlayan bir süreç olarak çalışmasını istiyorsanız, launchctl ve bir plist dosyasını kullanabilirsiniz.

#!/usr/bin/env python 
import os 
import time 

while True: 
    os.system('echo " foo" >> /Users/bob/foostore.txt') 
    time.sleep(1) 

, bir arka plan programı işlemi olarak çalıştırmak zorunda bir Plist dosyası oluşturmak için: Örneğin

Bora, ev dizininde bir dosyaya her saniye kelimesini 'foo' yazıyor basit python komut dosyası vardır , ~/Library/LaunchAgents/com.bobbob.osx.test.plist, içeriği:

launchctl load ~/Library/LaunchAgents/com.bobbob.osx.test.plist 
:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd > 
<plist version="1.0"> 
    <dict> 
    <key>Label</key> 
    <string>com.bobbob.osx.test</string> 
    <key>Program</key> 
    <string>/Users/bob/pyfoo.py</string> 
    <key>KeepAlive</key> 
    <true/> 
    </dict> 
</plist> 

sonra bir terminalden plist yüklemek için launchctl kullanımı

Bu komut dosyasını yükleyecek ve programı <key>Program</key> altındaki <string> öğesinde hemen çalıştıracaktır. Program için <ProgramArguments> düğümü kullanarak <string> öğesinin bir dizisini kullanarak bağımsız değişkenler de belirtebilirsiniz. Daha fazla bilgi için komut dosyasını kaldırmak istiyorsanız launchctl ait boşaltma komutunu kullanabilirsiniz, launchd.plist man page

bkz:

launchctl unload ~/Library/LaunchAgents/com.bobbob.osx.test.plist 

komut kullanılan Etiket herhangi bir şey olabilir, ama üzerinde benzersiz olmalıdır Sisteminiz, bu yüzden Apple genellikle ters alan adı kullanır.

Bir komut dosyasını otomatik olarak düzeltmeye gelince, bunu yapmanın bir yolu olduğunu sanmıyorum.

1

Sadece normal şekilde kabuk kullanarak arka planda Python komut dosyasını çalıştırın: Mac OS X tarafından yaptığı bir şey olsaydı

python myscript.py & 

autorun sorusuna gelince, bu çok büyük bir güvenlik deliği olurdu varsayılan, yani, hayır, elbette değil. Ancak, amaca göre böyle bir şey uygulayan bir komut dosyası yazabilirsiniz: takılıyken bir USB sürücüsünü periyodik olarak arayın ve takılıyken bir şey yapın (hatta ikinci bir komut dosyasını çalıştırın).

+0

sorununun ilk kısmı kadar iyi olması gerektiğine inanıyorum ama bu kabuk kapalı olduğunda çalışmaya devam etmeyecek, değil mi? – tkbx

+0

Evet, haklısın. Kabuklarımı asla kapatmam, böylece bunu düşünmedim. Daha iyi bir seçenek, betiği başlatan bir AppleScript uygulaması olabilir. – kindall

2

Bu soruya bakın. Unix benzeri sistemlerde python betiklerinin izlenmesi için yollar: Python Daemon Packaging Best Practices

Elbette, ihtiyacınız olan şey buysa, betiği kindall tarafından belirtildiği gibi arka planda çalıştırabilirsiniz.

0

Ben launchctl çalıştı ve El Capitan işe gelemedi ve etrafında biraz daha aradı ve bu post

TL Bulunan; senin senaryo üzerinde DR

Kullanım shebang hattını #!/usr/bin/env python veya #!/path/to/python

chmod +x test.py 
nohup /path/to/test.py & 
ps ax | grep test.py 
0

Not Defteri'ni kullanabilirsiniz https://linux.die.net/man/1/nohup

$ nohup python <your_script.py> & 

Bu işleminizi çalıştıracak ve çıktıyı aynı dizinde yer alan nohup.out dosyasına ekleyecektir. &, komut dosyasını diğer yanıtlarda açıklandığı gibi arka planda çalıştırır.