48

Ubuntu

touch: cannot touch `/var/run/test.pid': Permission denied

I am starting start-stop-daemon and like to write the PID file in /var/run start-stop-daemon is run as my-program-user

/var/run setting is drwxr-xr-x 9 root root

I like to avoid putting my-program-user in the root group.

69

By default, you can only write to /var/run as a user with an effective user ID of 0 (ie as root). This is for good reasons, so whatever you do, don't go and change the permissions of /var/run... Instead, as root, create a directory under /var/run:

# mkdir /var/run/mydaemon

Then change its ownership to the user/group under which you wish to run your process:

# chown myuser:myuser /var/run/mydaemon

Now specify to use /var/run/mydaemon rather than /var/run.

You can always test this by running a test as the user in question.

  • 5
    This worked fine for me but when I restarted my server then the /var/run/mydaemon directory was gone. – myborobudur May 15 '14 at 14:22
  • 17
    This is not a complete answer, /var/run is tmpfs by default on Ubuntu. Each time the server is started up the mkdir and chown command need to be re-run. – Tim Feb 23 '15 at 7:31
  • 1
    @Tim how about editing the answer and complete it? – kaiser Mar 2 '16 at 20:29
  • If you're dealing with daemon then a clean solution would be to add the path /var/run/mydaemon to the systemd unit file as described here. An easier hacky solution would be to add the mkdir and chown commands to the init.d script (if one exists) – odedfos May 6 '18 at 12:22
  • A better extensive answer is here: superuser.com/a/1127720/71795 a wrong answer which seems very elegant is here: stackoverflow.com/a/5174433. Summary: use either /tmp or ~. – Tim May 18 '18 at 20:53
13
mkdir /var/run/mydaemon
chown myuser:myuser /var/run/mydaemon

this will not work, since it will be lost at the next reboot (/var/run is a tmpfs on Ubuntu).

The only feasible solution is to run mkdir and chmod as part of the startup scripts.

3

You can try this. Create a directory /var/run/test/ and then change the permission of this directory to the same user as your program runs. " chown /var/run/test/" . Now in your application change the location of the PID file to /var/run/test/test.pid. This should get things working for you.

2

What about using the "sticky" bit on /var/run ?

chmod +t /var/run ?

Probably mess up some other apps, but it seems like it would be another solution.

I'll stick with creating a separate /var/run folder for now, however.

1

Entries in the /etc/permissions are permanent. Make an entry there to make the ownership and permissions for a directory permanent.

-6

To avoid putting your program-user in the root group, allow others write access:

# chmod 757
  • 3
    Never do a chmod 757 on /var/run! This would cause a serious security problem – michel Dec 2 '10 at 10:57
  • 1
    This is a terrible idea. It would cause a potentially massive security problem – Tom O'Connor Dec 2 '10 at 11:17
  • Even if we ignore the security problem, chmod 757 will also only work until the next reboot. Sorry about creating a new answer, but there seems to be no way to reply to the other comment. – Vladimir Nicolici Jan 7 '13 at 19:25
  • @michel, the author never said to do a chmod on /var/run. The author may have meant it for the application subdirectory. Not sure what all the fuss is about. – A-B-B Feb 25 '13 at 17:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.