Apache and some other programs need System V Inter-Process Communication (IPC) enabled in the Linux kernel. If you get this error when starting Apache:
[emerg] (38)Function not implemented: Couldn't create accept lock |
then it is possible that System V IPC is not enabled. If you are creating a custom Linux kernel, the option you want to enable System V IPC is:
CONFIG_SYSVIPC=y |
The proc filesystem, if enabled on your kernel, will list the semaphore usage. With Apache off:
root:/proc/sysvipc# cat sem key semid perms nsems uid gid cuid cgid otime ctime |
Let’s start Apache:
root:/proc/sysvipc# /usr/local/apache2/bin/apachectl start |
Now we see some usage:
root:/proc/sysvipc# cat sem key semid perms nsems uid gid cuid cgid otime ctime 0 98304 600 1 1001 4294967295 0 0 0 1241364839 root:/proc/sysvipc# |
The uid should match the uid of the process running Apache. Another way to check is with the ipcs command:
root:/proc/sysvipc# ipcs -s ------ Semaphore Arrays -------- key semid owner perms nsems 0x00000000 98304 apache 600 1 root:/proc/sysvipc# |
Note that there are resources associated with System V IPCs, and that a heavily used server can run out of these resources and throw a similar error. Specifically, you might see an error like “No space left on device: Couldn’t create accept lock”. This may be because the limit on semaphores had been reached and you need to set this at a higher number or free up some semaphores. You can use the ipcs -u command to list a summary of all related resources:
root:/proc/sysvipc# ipcs -u ------ Shared Memory Status -------- segments allocated 10 pages allocated 960 pages resident 833 pages swapped 0 Swap performance: 0 attempts 0 successes ------ Semaphore Status -------- used arrays = 1 allocated semaphores = 1 ------ Messages: Status -------- allocated queues = 0 used headers = 0 used space = 0 bytes root:/proc/sysvipc# |