I’m trying to change my process’ name as it appears in ps and Activity Monitor at runtime. I found several notes that there is no portable way to do this (which I don’t care about).
Here’s what I tried. None of these approaches worked for me.
- Changing
argv[0](seems to be the way to go on some Unix systems) - Calling
[[NSProcessInfo processInfo] setProcessName:@"someName"] - Calling
setprogname(callinggetprognamereturns the name I set, but that is irrelevant)
I also read about a function called setproctitle which should be defined in stdlib.h if it is available, but it’s not there.
There must be a way to accomplish this because QTKitServer – the faceless decoder for QuickTime Player X – has its corresponding QuickTime Player’s PID in its process name.
Does anybody have a clue about how to accomplish this? I’d very much prefer a Core Foundation or POSIXy way over an Objective-C method to do this.
Thanks,
Marco
Edit: If it is in any way relevant, I’m using Mac OS X 10.6.5 and Xcode 3.2.5
There are good reasons to change the process name. Java software should change process names because when running different java tools I want to see which java process is for which tool.
Chromium does it: http://src.chromium.org/viewvc/chrome/trunk/src/base/mac/mac_util.mm.
Node.js uses same code to implement
Process.title = 'newtitle': https://github.com/joyent/node/blob/master/src/platform_darwin_proctitle.ccNote: This fails if someone does
suto a different not logged-in user: https://github.com/joyent/node/issues/1727Here the source code in its full complex glory. By the way, someone told me it also works for Mac OS X Lion and also fails with
su.Edit: It’s a complex and confusing problem.
On OS X there is no setproctitle(3). One has to write into the argv array (ugly
and a bit dangerous because it is possible to overwrite some environment variables with bogus stuff). Done correctly it works very well.
Additionally Apple has the ActivityMonitor application, something like the Task Manager under Windows. The code above manipulates ActivityMonitor but this manipulation doesn’t seem to be encouraged by Apple (hence the use of undocumented functions).
Important: ps and ActivityMonitor don’t show the same information.
Also important: ActivityMonitor is not available if you don’t have GUI. This can happen if you ssh in to a remote Apple box and there is nobody logged in by GUI. Sadly there is a bug by Apple IMO. Just querying if there is a GUI sends an annoying warning message to stderr.
Summary: If you need to change ActivityMonitor, use the code above. If you have GUI-less situations and and dislike warnings on stderr, redirect stderr temporarily to /dev/null during the call of
SetProcessName. If you need to change ps information, write into argv.