"Launchd-owned processes unexpected behavior"

Post #302731289 by nextyoyoma on Wednesday 14th of November 2012 05:33:05 PM

Launchd-owned processes unexpected behavior

Ok, so I have been struggling with this for a few days and I think I need an explanation of a few things before I go any further. I'm not sure it's possible to do what I'm trying, so before I pull my hair out, here is what I'm doing:

I have written a program in LiveCode that sits on our students' computers and kills games and other apps that they have downloaded while they are at school. We set this app up as a launchdaemon so that they can't kill it or disable it in any way. The app works great for the most part, but there is one piece of the puzzle I just can't get working properly.

The kids like to play minecraft, which runs as a standalone java application. I want to kill it when it is running. However, I want the kids to be able to use java web-apps.

So the root of the problem is that I only know of one way to differentiate between java running as a web-app within a browser or a standalone app, and that is to see if "java" is the active or "frontmost" (in appleScript parlance) process. So first, if there is a better way to make this determination, that could solve my problem.

My first solution was this:
Code:
osascript -e 'tell application "System Events" to return the name of every process whose frontmost is true'

or simply running that as an AppleScript within LiveCode. The problem is that sometimes I get an error when doing this. The error varies from compiler errors to syntax errors to execution errors depending on the configuration.

The main issue seems to be that if system events is not already running as a user-owned process, the command fails. I don't understand why. I assume it has something to do with running the app as a launchd process. Is there something fundamental about the way these processes work that I'm missing.

Since the AppleScript solution didn't work well, I tried having LiveCode launch a python script:
Code:
from AppKit import NSWorkspace
activeAppName = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationName']
fo = open("/tmp/focus", "w")
fo.write( activeAppName )
fo.close()

As you can see, I even had python write to a file so that LiveCode can check it. This way it doesn't even have to communicate directly with python. Again, however, it seems to get various errors or simply fail to execute when the app is running as a daemon, although it works fine when running it as a user-level application.

So that long-winded story is all to say that I think my problems have to do with how processes are spawned when their parent process is a child of launchd, or how commands from these processes are managed. Could this be? Or am I completely off-base?

EDIT: To clarify, I'm mostly seeking an explanation of caveats/special things to consider when running a process as a daemon. Any specific solutions to my problem would be extremely appreciated, but I'd be very happy for anything that would help enlighten me.

EDIT 2: How silly of me to to forget: This is for OS X 10.7.4/5

Last edited by nextyoyoma; 11-14-2012 at 08:07 PM.. Reason: clarify focus of question
 
Test Your Knowledge in Computers #288
Difficulty: Easy
In Linux, Logical Volume Manager (LVM) is a device mapper target that provides sound card I/O management for the Linux kernel.
True or False?

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

How to delete everything owned bya particular user?

Hi I am an Oracle DBA and I want to delete everything owned byOracle on the AIX server. What command would do that? (5 Replies)
Discussion started by: sarangishere
5 Replies

2. OS X (Apple)

interval in a launchd script

Hi, i'm planning a to automate my backup with a rsync user deamon in my launchd and let that run every 2 hours. my server contains a lot of video data which can expand rapidly , up to 1TB, in an interval of 2 hours. now i'm wondering what will happen when a rsync is running longer then the... (1 Reply)
Discussion started by: wessel
1 Replies

3. Solaris

Unexpected df behavior

Hi, I have Sun SPARC Enterprise T5140 with two 2,5" 15rpm 146GB SAS HDD. In friday there were a lot of errors with fs on them. After reconfiguring all seemed to be fine but today I get the following strange behavior of df -kh command and troubles with files, I written on first disk in friday.... (9 Replies)
Discussion started by: Sapfeer
9 Replies

4. OS X (Apple)

[launchd] Creating a basic firewall

Hi, I'm trying to use launchd to detect whether certain ports are opened and if they are then to take some appropriate action, e.g. close the port or, worst case scenario, down the whole net connection. Apparently, force closing a port is not possible without killing the offending binary so... (3 Replies)
Discussion started by: ASGR
3 Replies

5. Shell Programming and Scripting

help with counting processes, bizzare behavior

I have a ksh script (dtksh Version M-12/28/93d on Solaris 10) that is run daily by cron and sometime hangs forever. I need to detect if there is an old copy hung before I start the new run, and if so send an email and exit the script. Here is part of the code: #!/usr/dt/bin/dtksh... (4 Replies)
Discussion started by: 73rdUserID
4 Replies

6. IP Networking

iptables DNAT of outgoing destination port, unexpected behavior

Not sure if this should be here or in the security section. I am developing software that dynamically manipulates netfilter/iptables rules (through system() calls of the command strings, I'm not trying to hack the netfilter code). Basically, UDP messages that are sent by an application on, say,... (0 Replies)
Discussion started by: cjh19460
0 Replies

7. UNIX for Advanced & Expert Users

unexpected behavior bash, set -o vi, history -a, and HISTFILE

I am trying to get my history in sync in multiple bash sections and things aren't working the way I expect. Desired behavior, hitting esc-K in all bash sessions (same userid and machine) will use the same history. Observed behavior: Esc-k shows the history of the current session, rather than... (8 Replies)
Discussion started by: gg48gg
8 Replies

8. Shell Programming and Scripting

Expect command when triggered by launchd

Hi folks, Im having trouble with an expect command in a shell script I use to back up mac os x servers. This one is being run on a 10.8.2 Server as part of a larger bash script. The script executes perfectly all the way through when triggered on the command line, but when launchd triggers it at... (4 Replies)
Discussion started by: rowie718
4 Replies

9. Shell Programming and Scripting

Unexpected Echo Behavior

Hello all, I have a basic issue that I can't seem to search for since I'm not sure how to describe the behavior. Could anyone kindly assist the novice? (Sample) File Data: bundle-ppp-1/1.78 bundle-ppp-1/2.80 bundle-ppp-1/1.79 bundle-ppp-1/2.81 bundle-ppp-1/1.80 bundle-ppp-1/2.82... (6 Replies)
Discussion started by: sjrupp
6 Replies

10. Shell Programming and Scripting

Delete everything owned by a particular user

I want to delete all files and folders owned a user say abcuser in the folder /tmp . Can you please give me the command ? Thanks Matt (2 Replies)
Discussion started by: lijjumathew
2 Replies
launch(3)						   BSD Library Functions Manual 						 launch(3)

NAME
launchd APIs -- interfaces for interacting with a launchd job. SYNOPSIS
#include <launch.h> #include <servers/bootstrap.h> kern_return_t bootstrap_check_in(mach_port_t bp, const name_t service_name, mach_port_t *sp); int launch_activate_socket(const char *name, int **fds, size_t *cnt); DESCRIPTION
A launchd(8) job may have resources that are held on behalf of it while it is not running to facilitate launch-on-demand. These interfaces allow for the job to retrieve these resources as part of its initialization. Currently supported resource types are XPC listener connections, Mach ports, and sockets. Use of XPC with launchd(8) is documented in the xpc(3) family of manual pages. MACH PORTS
The bootstrap_check_in() routine allows for a launchd(8) job to retrieve the receive right to a Mach port that launchd(8) has created on behalf of the job. launchd(8) creates this port and advertises it in the appropriate Mach bootstrap namespace by parsing the MachServices entry of the job's launchd.plist(5). The first argument to bootstrap_check_in() should always be the bootstrap_port() global. The second argument should be the name of the service whose port you wish to retrieve, as specified as an entry in the job's MachServices dictionary. The final argument, upon successful return, will be the name of the receive right corresponding to the port that launchd(8) had advertised in the bootstrap namespace. If the job closes the receive right to the port with mach_port_mod_refs() or exits, the receive right obtained by this routine will be send back to launchd(8) rather than being closed. This allows launchd to resume advertising the same port in the Mach bootstrap namespace and frees clients from the need to re-query for the send right to that port when the job dies. SOCKETS
The launch_activate_socket() routine allows a launchd(8) job to retrieve a set of file descriptors corresponding to a socket service that launchd(8) has created and advertised on behalf of the job by parsing the Sockets entry in the job's launchd.plist(5). The first argument should be the name of the socket entry as specified in the launchd.plist(5). The second argument, upon output, will point to an array of integers whose count is filled into the third argument upon success. This array represents all the sockets that launchd(8) created corre- sponding to the entry in the job's Sockets dictionary. Depending on the properties specified, a single Sockets entry may have multiple descriptors created for it (one for IPv4 and one for IPv6, for example). This array is allocated on the heap, and it is the caller's respon- sibility to call free(3) to dispose of the memory when it is no longer needed. RETURN VALUES
If launch_activate_socket() succeeds, zero is returned. In the event of failure, a non-zero POSIX-compatible error code indicating the nature of the error is returned. This error may be decoded with strerror(3). If bootstrap_check_in() succeeds, KERN_SUCCESS is returned. In the event of failure, a non-zero error code that may be decoded with bootstrap_strerror(). ERRORS
bootstrap_check_in() will fail if: [BOOTSTRAP_UNKNOWN_SERVICE] The Mach service name specified does not exist in the caller's launchd.plist(5). [BOOTSTRAP_SERVICE_ACTIVE] The specified Mach service has already been checked in by the job. launch_activate_socket() will fail if: [ENOENT] The socket name specified does not exist in the caller's launchd.plist(5). [ESRCH] The calling process is not managed by launchd(8). [EALREADY] The specified socket has already been activated. SEE ALSO
xpc(3), xpc_connection_create(3), socket(2), launchd(8), launchd.plist(5). Darwin 31 March, 2014 Darwin

Featured Tech Videos

All times are GMT -4. The time now is 06:48 PM.
Unix & Linux Forums Content Copyright 1993-2019. All Rights Reserved.
Privacy Policy