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?
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.
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.
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.