FUDforum
Fast Uncompromising Discussions. FUDforum will get your users talking.

Home » Imported messages » comp.lang.php » Queuing at job from within php program?
Show: Today's Messages :: Polls :: Message Navigator
Switch to threaded view of this topic Create a new topic Submit Reply
Queuing at job from within php program? [message #175666] Mon, 17 October 2011 13:24 Go to next message
bobmct is currently offline  bobmct
Messages: 16
Registered: September 2010
Karma: 0
Junior Member
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 #175667 is a reply to message #175666] Mon, 17 October 2011 15:20 Go to previous messageGo to next message
Jerry Stuckle is currently offline  Jerry Stuckle
Messages: 2598
Registered: September 2010
Karma: 0
Senior Member
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?

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex(at)attglobal(dot)net
==================
Re: Queuing at job from within php program? [message #175668 is a reply to message #175667] Mon, 17 October 2011 15:51 Go to previous messageGo to next message
bobmct is currently offline  bobmct
Messages: 16
Registered: September 2010
Karma: 0
Junior Member
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 #175669 is a reply to message #175668] Mon, 17 October 2011 16:47 Go to previous messageGo to next message
Jerry Stuckle is currently offline  Jerry Stuckle
Messages: 2598
Registered: September 2010
Karma: 0
Senior Member
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.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex(at)attglobal(dot)net
==================
Re: Queuing at job from within php program? [message #175670 is a reply to message #175669] Mon, 17 October 2011 18:27 Go to previous messageGo to next message
Robert Heller is currently offline  Robert Heller
Messages: 60
Registered: December 2010
Karma: 0
Member
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 #175673 is a reply to message #175670] Mon, 17 October 2011 20:53 Go to previous messageGo to next message
Jerry Stuckle is currently offline  Jerry Stuckle
Messages: 2598
Registered: September 2010
Karma: 0
Senior Member
On 10/17/2011 2:27 PM, Robert Heller wrote:
> 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.
>
>

It depends on what you're doing. Many web servers allow you to fork a
command, for good reasons. Just because you can execute a command shell
doesn't mean it's not properly secured.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex(at)attglobal(dot)net
==================
Re: Queuing at job from within php program? [message #175675 is a reply to message #175666] Tue, 18 October 2011 03:43 Go to previous messageGo to next message
Denis McMahon is currently offline  Denis McMahon
Messages: 634
Registered: September 2010
Karma: 0
Senior Member
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 07:51 Go to previous messageGo to next message
alvaro.NOSPAMTHANX is currently offline  alvaro.NOSPAMTHANX
Messages: 277
Registered: September 2010
Karma: 0
Senior Member
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 08:12 Go to previous messageGo to next message
Erwin Moller is currently offline  Erwin Moller
Messages: 228
Registered: September 2010
Karma: 0
Senior Member
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] Thu, 20 October 2011 01:40 Go to previous messageGo to next message
bobmct is currently offline  bobmct
Messages: 16
Registered: September 2010
Karma: 0
Junior Member
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
Re: Queuing at job from within php program? SOLVED! [message #175693 is a reply to message #175687] Fri, 21 October 2011 01:21 Go to previous message
bobmct is currently offline  bobmct
Messages: 16
Registered: September 2010
Karma: 0
Junior Member
It was in fact an entry in the at.deny file. I've temporarily
circumvented this until I have a better solution. Thanks all.
  Switch to threaded view of this topic Create a new topic Submit Reply
Previous Topic: declaring private variable in class
Next Topic: simple session question
Goto Forum:
  

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ]

Current Time: Sun Nov 03 13:23:03 GMT 2024

Total time taken to generate the page: 0.03719 seconds