what does launchd status 78 mean?? why my user agent not running??
Asked Answered
D

10

58

I want to run a unison sync service running in the background whenever I login. But the status code of my agent is 78. I don't know why, I tried some fix posted online, but it just doesn't work.

What's the problem?? below is the plist file for my service.

<?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>syncmyproject</string>
    <key>StandardOutPath</key>
    <string>/var/log/syncmyproject.log</string>
    <key>StandardErrorPath</key>
    <string>/var/log/syncmyproject.log</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>Debug</key>
    <true/>
    <key>EnableGlobbing</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/bin/unison</string>
      <string>-auto</string>
      <string>-batch</string>
      <string>-repeat watch</string>
      <string>~/home/project</string>
      <string>~/project</string>
    </array>
</dict>
</plist>
Dewyeyed answered 11/12, 2015 at 3:15 Comment(2)
You can grep this file for possible clues as to what's wrong: /var/log/system.logHypochondrium
The advice to look at either /var/log/system.log or /var/log/com.apple.xpc.launchd/launchd.log should be the accepted answer. In my case launchctl list returned just "78" and that's it, but launchd.log had a much more detailed error message.Hah
D
66

I read man launchctl, find 78 means function not implemented. It doesn't help much.

Finally I make it work, actually there were errors in the plist, I recommend to install the brew install --cask launchcontrol, which is a gui tool for launchctl, it can help detect errors and trouble shooting.

Dewyeyed answered 11/12, 2015 at 6:38 Comment(13)
Thanks for this. launchcontrol helped solve my issue. For the record I had status 78 and my issue was that my script did not start with an interpreter e,g; #!/bin/shAirfoil
For me the problem was, that the log directory was not accessible by the current user.Radiator
yep, me too. I had an error in the shebang. This made it difficult to debug since the script performed flawlessly when I executed it, but not when launchd tried to execute it.Athabaska
launchcontrol was quite helpful! It costs money but the trial version can still catch errors, it just won't save the new plist file. One issue that caught me was that standard error output path was set to a path it couldn't write to. LaunchControl caught this and detected it while launchctl would only ever give me exist code 78! Also this website, launchd.info, but the LaunchControl person has lots of useful troubleshooting info. It sort of plugs LaunchControl in a few places but is also useful by itself.Rewarding
The issue in my case was the application targeted did not have execute permissionsDamnable
An invalid WorkingDirectory can cause a status code of 78 as well.Eakin
for me the problem was clearly mentioned in /var/log/system.log that the script's permission is denied. chmod 755 was sufficient to get everything work. also note that if anything is added to PATH via a custom script added in bashrc or bash_profile that doesn't get executed as well so best to place your entire PATH as EnvironmentVariables list in the plist file.Register
launchcontrol helped with this. i created an app from a shell script using Automator and i needed to update the path in plist to target the executable Application Stup, not the application folder.Mothy
LaunchControl is trial software, forget about it.Arresting
If I enter launchctl list in terminal I see my launchd job showing 78. However if I load up LaunchControl, I cannot see my job, am I doing something wrong? I've used the dropdown with the system agents / daemon agents & all the others but it is not there. Also, where to put #!/bin/sh?Marnimarnia
These days it's brew install --cask launchcontrol for anyone stumbling upon this answer. I've submitted an edit as well.Kauai
@AdrianMaire however, the trial version helped me to find the issue. In my case I was trying to launch an application bundle (.app). LaunchControl also provided the solution which is to use /usr/bin/open.Trophoblast
To learn what an error code means, simply run launchctl error my_err_codeOur
E
17

I found the error had to do with permissions. I was trying to redirect errors and logs to the /var/log directory which my user is not able to write to. Changing the path to something where my user had proper permissions to r+w fixed it.

Also, be careful when loading your LaunchAgents. Do not use sudo to load a plist if you are in the ~/Library/LaunchAgents directory.

Expense answered 13/2, 2017 at 22:33 Comment(2)
Holy smokes, that was my error too! Changing the logs to a different folder fixes it.Overpower
"Be careful when loading your LaunchAgents. Do not use sudo to load a plist if you are in the ~/Library/LaunchAgents directory." Oh my holy goat. This... You are my hero.Amphithecium
B
14

To view a description of all error codes, type

launchctl error <insert numerical error code here>

e.g.:

% launchctl error 77 77: No locks available

Bibliomania answered 19/2, 2020 at 20:36 Comment(0)
C
8

[Ran into this problem as well, so documenting what I've found]

"78" is the last exit code of the job you're running. From man launchctl:

With no arguments, list all of the jobs loaded into launchd in three columns. The first column displays the PID of the job if it is run- ning. The second column displays the last exit status of the job. If the number in this column is negative, it represents the negative of the signal which stopped the job. Thus, "-15" would indicate that the job was terminated with SIGTERM. The third column is the job's label. If [label] is specified, prints information about the requested job.

I.e. you need to read the documentation (or source code) for whatever job you're starting. (In my case, mysqld)

It's worth noting that "78" is mentioned as a standard exit code on Linux, indicating a configuration error. So take a look at your job configuration (and error logs?) to see if you have something misconfigured.

Chkalov answered 8/12, 2016 at 13:56 Comment(3)
in my case I had forgotten to chmod +x the shell script ':)Mood
In my case, the log rotator (newsyslog) wasn't configured to restore the previous owner of the stdout and stderr files, rendering them unwritable to the current user.Bierman
my 5 cent is to use /tmp/demo.stderr* as StandardErrorPath value in non-root user mode, but Console.app log does not complain anything about permission.Delete those Standard*Path values in plist make my service pid status return to 0.Ronnyronsard
J
5

Here's what caught me: In Mac OS X you can run shell-scripts from command-line even if there's "just the script" in the file. However, when you run them from launchd you have to tell which binary that should run the script. A suppose that when you run from command-line it just uses the shell you are currently in (in my case bash), but when running from launchd there is no "surrounding script". I added

#!/bin/sh

as the first line in the script file, and then it worked.

Jennifferjennilee answered 26/9, 2017 at 9:33 Comment(3)
Also I had comments as file header before #!, which cause the error. The script should not have any comments before #!.Middleaged
@dan-bergh-johnsson can you tell me exactly where to put the #!/bin/sh please? Could you please put an example? Thank youMarnimarnia
@Marnimarnia The #!/bin/sh must be at the exact beginning of the file. On the first line, not indented. In fact, # and ! must be the first two bytes of the file on disk.Ninety
R
4

In my case, script in <ProgramArguments> is not executable and thus get 78 function not implemented.

Retentive answered 4/8, 2020 at 8:23 Comment(2)
This was my issue. Upgraded to Catalina and everything stopped working code 78! Was because Catalina chmod 700 ~/Documents without me knowing.Seat
I can't up vote this enough. You saved me :pray: :bow:Seat
A
3

Similar to above I was getting a status 78 because I had symlink in my script path. The fix was to use the absolute path.

Apogee answered 4/9, 2018 at 17:47 Comment(0)
F
2

I got this error while trying to run mono to start a local webserver. Turns out the fix was to not use the mono path given by "which mono" (which is a symlink: /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono) but the actual location of the exe (in my case /Library/Frameworks/Mono.framework/Commands/mono).

Famagusta answered 15/11, 2016 at 7:49 Comment(0)
E
1

I'm keeping getting 78 code for the sake of xml format issue:

At first, My emacs auto reformat my xml like this:

<?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>user.eric.g.autosyncdropbox.agent</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/eric/G/bin/fswatchG.sh</string>
    </array>
    <key>KeepAlive</key>
    <true />
    <key>StandardOutPath</key>
    <string>
    /Users/eric/.tmp/user.eric.g.autosyncdropbox.out.log</string>
    <key>StandardErrorPath</key>
    <string>
    /Users/eric/.tmp/user.eric.g.autosyncdropbox.error.log</string>
  </dict>
</plist>

And I was not able to find these two line is returned...

    <string>
    /Users/eric/.tmp/user.eric.g.autosyncdropbox.out.log</string>
    <key>StandardErrorPath</key>
    <string>
    /Users/eric/.tmp/user.eric.g.autosyncdropbox.error.log</string>

That was sucks, and absolutely a waste of life...

Emmy answered 25/7, 2020 at 9:43 Comment(0)
F
1

I was chasing for the status 78 error for a long time.

My LaunchDamon could be started by hand with status 0 , but after a system reboot it has the status 78. Sometimes the daemon was running, sometimes it was not.

Using the app LaunchControl ( which is great btw.) didn't help in this case. There was no output in the standard out and err files.

I could solve the problem by adding a KeepAlive condition to the daemons plist file, referencing a mounted file system where the daemon executable resides.

<key>KeepAlive</key>
<dict>
    <key>PathState</key>
    <dict>
    <key>/Volumes/MountedFileSystem</key>
    <true/>
    </dict>
</dict>

I hope this tip might help someone.

Flanna answered 2/6, 2021 at 10:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.