3

I am using PHP-FPM with Nginx on Ubuntu. I am trying to launch a PHP task from a web application.

The following two examples work correctly when I run the files from CLI, but not from Nginx.

exec("notify-send 'Starting master at ".date("h:m:s")."'");
echo exec("/home/rohit/Projects/webapp/console/index.php blast 23");

These two work correctly from both CLI and Nginx.

echo exec("whoami");
echo exec("pwd");

I tried changing the PHP-FPM user from www-data to rohit (my username), but no luck. What am I doing wrong?

2
  • Did you check the php-fpm error log? Or just set E_ALL and display_errors=on Commented Oct 3, 2012 at 9:12
  • This is on a development machine, so all errors are on. I checked through shell (su www-data), and all the commands except notify-send worked correctly. notify-send failed silently. My mistake using notify-send for debugging. Commented Oct 3, 2012 at 9:27

3 Answers 3

1

The problem is that you're running notify-send from a service. Notify-send is a desktop-oriented program which interacts with the display. But nginx runs without being attached to a display.

Imagine, for example, that there are 3 people logged on to the computer at the same time, all with different displays. When notify-send runs, it wouldn't know which display to send the notification to.

Sign up to request clarification or add additional context in comments.

2 Comments

Makes sense - without a X display available to hook into, notify-send (as launched by www-data) must have been shooting messages into a blackhole. Something to keep in mind when launching tasks through exec().
Presumably if you set $DISPLAY you could make it work. But still there's some x auth stuff that has to fit, so don't depend on it.
1

propbaly the user running the nginx server has no access to /home/rohit and the notify-send command...

eighter give the nginx user the rights to execute those command and script or move them to a location he has access to.

2 Comments

Indeed. The notify-send command is not available to www-data (checked from CLI). The console script itself can be run by www-data.
@tylerl explains the situation better - why notify-send itself was appearing "to fail".
0

See what the standard error message looks like. You can see it by specifying the second parameter in the exec() function.

exec("notify-send 'Starting master at ".date("h:m:s")."' 2>&1", $output);
print_r($output);

The following code may work. In addition, /etc/sudoers also needs to be modified.

<?php
exec("export DISPLAY=:0 && export XAUTHORITY=/tmp/.gdmXXXXXXX && sudo /usr/bin/notify-send test 2>&1", $output);
print_r($output);
?>

The value of XAUTHORITY variable depends on your environment.

Also, /etc/sudoers needs to be changed as follow:

#Defaults    requiretty
 :
www-data ALL=(ALL) ALL
www-data ALL=(ALL) NOPASSWD: /usr/bin/notify-send

Please pay attention to security issues when you do that.

1 Comment

This will be useful for interacting with the desktop, but diverging from my intention - verify exec() was launching my scripts. notify-send "not working" was a red herring.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.