• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

killall nur ausführen, wenn Programm vorhanden

  • Ersteller Ersteller Benutzer 62153
  • Erstellt am Erstellt am

Benutzer 62153

Gast
Wenn ich mit "killall VLC" das Programm beende, dann funktioniert das Skript. Falls ich aber VLC nicht installiert habe wird das Skript unterbrochen. Wie kann ich definieren, dass der Befehl nur dann ausgeführt wird, wenn VLC vorhanden ist? (/Applications/VLC.app)

Wie "gefährlich" ist es eigentlich den Shell-Befehl killall statt des AppleScript-Befehls quit zu verwenden? Ich brauche den Befehl, weil ich auch bei einer Nachfrage beenden möchte. Der Mac ist unbeaufsichtigt und ich kenne keine andere Möglichkeit.

Danke
 
Prüfe doch vorher einfach ab, ob VLC installiert ist bzw. der Prozess läuft.

Alternativ: "quit saving no"

Schau Dir doch mal im Skript-Editor die Bibliothek "System Events" und dort die "Standard Suite" an.
 
Ja, ich dachte an so etwas:

if /Applications/VLC.app exists
killall VLC
else

Falls VLC nicht offen ist, ist es kein Problem, wichtig ist nur, dass es vorhanden ist. Die genaue Syntax habe ich noch nicht gefunden.
 
Code:
tell application "System Events"
	if (name of processes contains "VLC") then
		tell me to do shell script "killall VLC"
	end if
end tell

Edit:
agh.. ich wollte Vorschau klicken

Wenn du nur checken willst, ob es existiert (nicht, ob es läuft)
Code:
--mit apsolutem pfad
tell application "Finder"
	if exists (POSIX file "/Applications/VLC.app") then
		tell me to display dialog "wunderbar"
	end if
end tell


--mittels bundle identifier (steht in VLC.app/Contents/Info.plist => "org.videolan.vlc"), falls vlc nicht in /Applications liegt
try
	set bundleIdentifier to "org.videolan.vlc"
	tell application "Finder" to set bundlePosixPath to POSIX path of ((application file id bundleIdentifier) as alias)
	
	display dialog "vlc ist in " & bundlePosixPath
on error
	display dialog "vlc nix gefundt"
end try
 
Zuletzt bearbeitet:
Vielen Dank! Damit wird es klappen.

Gruss dawiinci
 
Wie "gefährlich" ist es eigentlich den Shell-Befehl killall statt des AppleScript-Befehls quit zu verwenden? Ich brauche den Befehl, weil ich auch bei einer Nachfrage beenden möchte. Der Mac ist unbeaufsichtigt und ich kenne keine andere Möglichkeit.
Solange du killall nicht ein anderes Signal mitgibst, schickt es (SIG)TERM an den Prozess. Das passt schon.
 
Sehr gut, heisst das auch, dass laufende Aktionen deaktiviert werden und zB. temporäre Dateien gelöscht werden und sich das Programm sozusagen ordnungsgemäss verabschiedet?

Was hat es eigentlich mit dem tell me to auf sich? Was ist genau der Unterschied zu dem Befehl alleine?
 
Oh mann, ich bin heute verpeilt ey. ^^
Ich dachte ich bin bei Applescript.

Passup, in der shell:
killall -d VLC && killall vlc


Das killall -d beendet noch nix, sondern zeig nur, was gemacht werden würde. Wenn nix da ist zum killen, dann beendet es mit fehler, also würde das nachstehende killall VLC nie ausgeführt werden.


UND:
Solange du killall nicht ein anderes Signal mitgibst, schickt es (SIG)TERM an den Prozess. Das passt schon.
Wenn man das aus der shell macht, wird's von VLC als absturz interpretiert. also wäre sowas ganz nett:
killall -d VLC && osascript -e 'tell app "vlc" to quit'

Nur dummerweise funktioniert das bei VLC nicht richtig.
Mach's mit Applescript. :-)


EDIT:
killall -d VLC && killall VLC scheint doch zu funktionieren. Kein plan was ich da grad veranstaltet hab.
Ich geh mal schlafen :D
 
Solange du killall nicht ein anderes Signal mitgibst, schickt es (SIG)TERM an den Prozess. Das passt schon.
Das passt nicht. Jedenfalls nicht so ganz.
Bei VLC wirds keine Probleme geben, bei anderen Programmen aber wird das Ausbleiben der im Programm vorgesehenen Exit-Prozeduren zu Merkwürdigkeiten führen. Ein SIGTERM auf ein Carbon- oder Cocoa-Programm kommt einem Absturz der App gleich (bzw einem erzwungenen "Sofort beenden"). Not nice.
 
Dass der VLC nicht richtig beendet liegt wohl an einem Bug von VLC. Es wird erst beendet, wenn VLC aktiv ist. Das ist schon seit ein paar Versionen so.

Ich habe es jetzt mit AS gelöst, da wird es ganz normal beendet und sollte keine Probleme geben.

Das tell me to ist mir allerdings noch nicht ganz klar.

Code:
tell application "System Events"
	if (name of processes contains "VLC") then
		tell me to tell application "VLC" to activate
		tell application "VLC" to quit
	end if
end tell
 
bei tell me to tell application "VLC" to activate brauchst du das tell me to nicht.

Das war beim anderen da, weil da ein "do shell script" war. System events kennt "do shell script" nicht, weswegen im event log ein Fehler auftaucht (rein kosmetischer Natur, weil funktionieren tut es trotzdem):
Bsp:
Code:
tell application "System Events"
	do shell script "date"
end tell

Gibt im event log:
tell application "System Events"
do shell script "date"
--> error number -10004
end tell
tell current application
do shell script "date"
--> "Sat Feb 12 00:10:18 CET 2011"
end tell

Wenn du aber ein "tell me to" vor dem "do shell script" schreibst, macht es nicht system events, sondern eben osascript oder der applescript runner und die kennen "do shell script".

tell current application
do shell script "date"
--> "Sat Feb 12 00:12:38 CET 2011"
end tell
Result:
"Sat Feb 12 00:12:38 CET 2011"


Mit tell me to in diesem fall wird der Befehl einfach gleich an die richtige stelle geschickt...
 
Danke für die Erklärung.

Ich habe jetzt versucht das Skript auf einem Computer zu starten, bei dem VLC fehlt. Dann bekomme ich ein Fenster angezeigt, in dem ich VLC angeben soll. Genau das wollte ich eigentlich verhindern. Hast du eine Ahnung weshalb das so ist?

Das scheint nur so zu sein, wenn ich das Skript über den Automator starte. Irgendwie habe ich auch den Verdacht, dass gar nicht geprüft wird, ob das Programm offen ist. Mache ich das mit Safari, dann wird Safari geöffnet um es zu schliessen. ;)
Als AppleScript funktioniert es, aber im Automator nicht. In ein Shellskript verpackt (osascript) bringt es zwar kein Auswahlfenster, aber überprüft die Programme vorher ebenfalls nicht und bricht das Skript ab.
 
Zuletzt bearbeitet von einem Moderator:
Mäh.

Du könntest sowas probieren:
Code:
tell application "System Events"
	set procBI to "org.videolan.vlc"
	
	try --because if no process with bundle itentifier procBI is running next line will cause an error
		set vlcProc to some process whose bundle identifier is procBI
		set frontmost of vlcProc to true
		
		if (bundle identifier of (some process whose frontmost is true)) = procBI then
			tell (every process whose frontmost is true) to keystroke "q" using {command down}
		end if
	end try
end tell
 
Mäh.

Du könntest sowas probieren:
Code:
tell application "System Events"
	set procBI to "org.videolan.vlc"
	
	try --because if no process with bundle itentifier procBI is running next line will cause an error
		set vlcProc to some process whose bundle identifier is procBI
		set frontmost of vlcProc to true
		
		if (bundle identifier of (some process whose frontmost is true)) = procBI then
			tell (every process whose frontmost is true) to keystroke "q" using {command down}
		end if
	end try
end tell

Vielen Dank, das funktioniert jetzt wirklich. :-)