Queuing at job from within php program? [message #175666] |
Mon, 17 October 2011 09:24 |
bobmct
Messages: 16 Registered: September 2010
Karma: 0
|
Junior Member |
add to buddy list ignore all messages by this user
|
|
Fellow php'ers;
I'm having some difficulty getting this to work: Based on a date/time
selected by a user on a web form I would like to use the "at" command to
schedule that task.
I've tried various php functions (system, exec, passthru) with the same
results (return code 1 - which I cannot seem to get the error message
from).
Here is a sample code snippet:
$cmd = "echo \"podcast -c $filename\" | at $hr:$mn $_ampm";
passthru("$cmd", $Retcode);
echo "$Retcode";
returns 1
Then I thought that perhaps the 'at' was not reading stdin in this case
so I tried a temporary file approach:
$cmd = "echo \"podcast -c $filename\"";
file_put_contents($filename.tmp, $cmd);
passthru("at $_hr:$_mn $_ampm < $filename.tmp", $_RetVal);
echo "$_RetVal";
This time it returned 2
I've got to be misunderstanding this function. So, I thought if any of
you skilled readers have had luck with doing something like this you may
be willing to share. However, any other suggestions greatly appreciated.
Thanks
|
|
|
|
Re: Queuing at job from within php program? [message #175668 is a reply to message #175667] |
Mon, 17 October 2011 11:51 |
bobmct
Messages: 16 Registered: September 2010
Karma: 0
|
Junior Member |
add to buddy list ignore all messages by this user
|
|
On Mon, 17 Oct 2011 11:20:38 -0400, Jerry Stuckle wrote:
> On 10/17/2011 9:24 AM, bobm3(at)worthless(dot)info wrote:
>> Fellow php'ers;
>>
>> I'm having some difficulty getting this to work: Based on a date/time
>> selected by a user on a web form I would like to use the "at" command
>> to schedule that task.
>>
>> I've tried various php functions (system, exec, passthru) with the same
>> results (return code 1 - which I cannot seem to get the error message
>> from).
>>
>> Here is a sample code snippet:
>>
>> $cmd = "echo \"podcast -c $filename\" | at $hr:$mn $_ampm";
>> passthru("$cmd", $Retcode);
>> echo "$Retcode";
>>
>> returns 1
>>
>> Then I thought that perhaps the 'at' was not reading stdin in this case
>> so I tried a temporary file approach:
>>
>> $cmd = "echo \"podcast -c $filename\"";
>> file_put_contents($filename.tmp, $cmd); passthru("at $_hr:$_mn $_ampm<
>> $filename.tmp", $_RetVal); echo "$_RetVal";
>>
>> This time it returned 2
>>
>> I've got to be misunderstanding this function. So, I thought if any of
>> you skilled readers have had luck with doing something like this you
>> may be willing to share. However, any other suggestions greatly
>> appreciated.
>>
>> Thanks
>
>
> What is actually in $cmd when you execute the passthru command?
>
> What happens when you type this exact output at a command line prompt?
I've echoed out the contents of $cmd in my testing. It does contain
exactly what is intended:
echo "podcast -c abc123 | at 10:01 am"
Also, the command I'm trying to execute works perfectly from the CLI with
the same (appropriate) values.
I'm thinking that there might be a permissions issue but I'm unable to
obtain the error message from the passthru command.
I suppose next I will try to create a small php script to emulate this
from the CLI and perhaps them I will see the error (if any).
Thanks
|
|
|
|
Re: Queuing at job from within php program? [message #175670 is a reply to message #175669] |
Mon, 17 October 2011 14:27 |
|
At Mon, 17 Oct 2011 12:47:08 -0400 Jerry Stuckle <jstucklex(at)attglobal(dot)net> wrote:
>
> On 10/17/2011 11:51 AM, bobm3(at)worthless(dot)info wrote:
>> On Mon, 17 Oct 2011 11:20:38 -0400, Jerry Stuckle wrote:
>>
>>> On 10/17/2011 9:24 AM, bobm3(at)worthless(dot)info wrote:
>>>> Fellow php'ers;
>>>>
>>>> I'm having some difficulty getting this to work: Based on a date/time
>>>> selected by a user on a web form I would like to use the "at" command
>>>> to schedule that task.
>>>>
>>>> I've tried various php functions (system, exec, passthru) with the same
>>>> results (return code 1 - which I cannot seem to get the error message
>>>> from).
>>>>
>>>> Here is a sample code snippet:
>>>>
>>>> $cmd = "echo \"podcast -c $filename\" | at $hr:$mn $_ampm";
>>>> passthru("$cmd", $Retcode);
>>>> echo "$Retcode";
>>>>
>>>> returns 1
>>>>
>>>> Then I thought that perhaps the 'at' was not reading stdin in this case
>>>> so I tried a temporary file approach:
>>>>
>>>> $cmd = "echo \"podcast -c $filename\"";
>>>> file_put_contents($filename.tmp, $cmd); passthru("at $_hr:$_mn $_ampm<
>>>> $filename.tmp", $_RetVal); echo "$_RetVal";
>>>>
>>>> This time it returned 2
>>>>
>>>> I've got to be misunderstanding this function. So, I thought if any of
>>>> you skilled readers have had luck with doing something like this you
>>>> may be willing to share. However, any other suggestions greatly
>>>> appreciated.
>>>>
>>>> Thanks
>>>
>>>
>>> What is actually in $cmd when you execute the passthru command?
>>>
>>> What happens when you type this exact output at a command line prompt?
>>
>> I've echoed out the contents of $cmd in my testing. It does contain
>> exactly what is intended:
>> echo "podcast -c abc123 | at 10:01 am"
>>
>> Also, the command I'm trying to execute works perfectly from the CLI with
>> the same (appropriate) values.
>>
>> I'm thinking that there might be a permissions issue but I'm unable to
>> obtain the error message from the passthru command.
>>
>> I suppose next I will try to create a small php script to emulate this
>> from the CLI and perhaps them I will see the error (if any).
>>
>> Thanks
>
> OK, when you enter that exactly from the CLI it works? Are you
> executing it as root or another user?
>
> Next: the home directory for the web server will be different than the
> one from the CLI. Also, the web server will have different permissions.
> Usually the web server user will not have permission to access the
> atjobs directory (/var/spool/cron/atjobs on Debian).
>
> Try su'ing (or sudo'ing) to the web server's id, change to the web
> server's root directory and execute the command.
On a *typical* (eg properly secured) LAMP server, the web server would
be running as the user 'apache' and the apache user's shell will be set
to '/sbin/nologin'. This means that the web server user cannot login to
a shell. This implies that you cannot fork() a *shell*:
sauron.deepsoft.com% sudo su apache -l
This account is currently not available.
In order to run an at command, you need to fork() a shell process.
--
Robert Heller -- 978-544-6933 / heller(at)deepsoft(dot)com
Deepwoods Software -- http://www.deepsoft.com/
() ascii ribbon campaign -- against html e-mail
/\ www.asciiribbon.org -- against proprietary attachments
|
|
|
|
Re: Queuing at job from within php program? [message #175675 is a reply to message #175666] |
Mon, 17 October 2011 23:43 |
|
On Mon, 17 Oct 2011 13:24:27 +0000, bobm3 wrote:
> Fellow php'ers;
>
> I'm having some difficulty getting this to work: Based on a date/time
> selected by a user on a web form I would like to use the "at" command to
> schedule that task.
>
> I've tried various php functions (system, exec, passthru) with the same
> results (return code 1 - which I cannot seem to get the error message
> from).
>
> Here is a sample code snippet:
>
> $cmd = "echo \"podcast -c $filename\" | at $hr:$mn $_ampm";
> passthru("$cmd", $Retcode);
> echo "$Retcode";
>
> returns 1
>
> Then I thought that perhaps the 'at' was not reading stdin in this case
> so I tried a temporary file approach:
>
> $cmd = "echo \"podcast -c $filename\""; file_put_contents
($filename.tmp,
> $cmd); passthru("at $_hr:$_mn $_ampm < $filename.tmp", $_RetVal); echo
> "$_RetVal";
>
> This time it returned 2
>
> I've got to be misunderstanding this function. So, I thought if any of
> you skilled readers have had luck with doing something like this you may
> be willing to share. However, any other suggestions greatly
> appreciated.
>
> Thanks
Here's an example of calling a php file every minute to queue itself to
run again a minute later. Note that it uses a script file and a php file
Note that I've used "/path/" to indicate that on my system I used
absolute paths to define both files.
The script file calls the php file with the php cli processor:
--8<-- start /path/testit --8<--
#!/bin/bash
php /path/testit.php
--8<-- end /path/testit --8<--
and the php file executes a system call to schedule the script file:
--8<-- start /path/testit.php --8<--
<?php
system("at -m now +1 minutes -f /path/testit");
?>
--8<-- end /path/testit.php --8<--
I did notice that in my /etc/at.deny is an entry for my web server
process, so I guess that any attempt to invoke at from within the web
server would fail. I don't recall setting this, so it may be a default -
might be worth checking?
Rgds
Denis McMahon
|
|
|
Re: Queuing at job from within php program? [message #175677 is a reply to message #175668] |
Tue, 18 October 2011 03:51 |
|
El 17/10/2011 17:51, bobm3(at)worthless(dot)info escribió/wrote:
>> What is actually in $cmd when you execute the passthru command?
>>
>> What happens when you type this exact output at a command line prompt?
>
> I've echoed out the contents of $cmd in my testing. It does contain
> exactly what is intended:
> echo "podcast -c abc123 | at 10:01 am"
This is the echo command. All it does is printing a string into the
standard output. PHP doesn't actually do much with your command; it
basically feeds the shell with it as-is. So before caring about
executing a command from PHP, you need to make sure that the command
itself works as expected.
--
-- http://alvaro.es - Álvaro G. Vicario - Burgos, Spain
-- Mi sitio sobre programación web: http://borrame.com
-- Mi web de humor satinado: http://www.demogracia.com
--
|
|
|
Re: Queuing at job from within php program? [message #175678 is a reply to message #175666] |
Tue, 18 October 2011 04:12 |
Erwin Moller
Messages: 228 Registered: September 2010
Karma: 0
|
Senior Member |
add to buddy list ignore all messages by this user
|
|
On 10/17/2011 3:24 PM, bobm3(at)worthless(dot)info wrote:
> Fellow php'ers;
>
> I'm having some difficulty getting this to work: Based on a date/time
> selected by a user on a web form I would like to use the "at" command to
> schedule that task.
>
> I've tried various php functions (system, exec, passthru) with the same
> results (return code 1 - which I cannot seem to get the error message
> from).
>
<snip>
Others commented on the issues that can arrise with rights.
(More specific: the PHP-user (www-data or apache) adding tasks.)
I want to add another approach that I prefer.
(Written for Unix-lie systems. Replace cronjob with task-scheduler for
Windows.)
Personally I don't like my software to schedule new tasks automatically.
So if I need scheduling, I prefer to create 1 cronjob by hand, for
www-data, that runs a script (can be PHP).
That script than pulls from a database certain tasks WHEN they are needed.
Depending on the time-resolution you need you can run this cron-job once
a day, once an hour, every minute, etc.
I like it that way because I can catch the result, log the last time it
ran, etc. And e-mail myself or some admin in case of failure.
Just a thought. Maybe it helps in your situation.
If not, consider this noise. ;-)
Regards,
Erwin Moller
--
"That which can be asserted without evidence, can be dismissed without
evidence."
-- Christopher Hitchens
|
|
|
Re: Queuing at job from within php program? [message #175687 is a reply to message #175678] |
Wed, 19 October 2011 21:40 |
bobmct
Messages: 16 Registered: September 2010
Karma: 0
|
Junior Member |
add to buddy list ignore all messages by this user
|
|
On Tue, 18 Oct 2011 10:12:13 +0200, Erwin Moller
<Since_humans_read_this_I_am_spammed_too_much(at)spamyourself(dot)com> wrote:
> On 10/17/2011 3:24 PM, bobm3(at)worthless(dot)info wrote:
>> Fellow php'ers;
>>
>> I'm having some difficulty getting this to work: Based on a date/time
>> selected by a user on a web form I would like to use the "at" command to
>> schedule that task.
>>
>> I've tried various php functions (system, exec, passthru) with the same
>> results (return code 1 - which I cannot seem to get the error message
>> from).
>>
>
> <snip>
>
> Others commented on the issues that can arrise with rights.
> (More specific: the PHP-user (www-data or apache) adding tasks.)
>
> I want to add another approach that I prefer.
> (Written for Unix-lie systems. Replace cronjob with task-scheduler for
> Windows.)
>
> Personally I don't like my software to schedule new tasks automatically.
> So if I need scheduling, I prefer to create 1 cronjob by hand, for
> www-data, that runs a script (can be PHP).
> That script than pulls from a database certain tasks WHEN they are needed.
> Depending on the time-resolution you need you can run this cron-job once
> a day, once an hour, every minute, etc.
>
> I like it that way because I can catch the result, log the last time it
> ran, etc. And e-mail myself or some admin in case of failure.
>
> Just a thought. Maybe it helps in your situation.
> If not, consider this noise. ;-)
>
> Regards,
> Erwin Moller
Thanks all for the great comments. I haven't looked at the at.deny
file yet but I will. Regarding the suggestion about storing the
request and triggering at defined intervals: that's my direction. But
seeing how I'm replacing a manual system now I need something to queue
these requests short-term while I find time to complete the back end.
Thanks again - Bob
|
|
|
|