ash , exporting env vars

beebee at piments.com beebee at piments.com
Mon Jul 5 18:09:30 UTC 2010


On 07/05/10 17:47, Denys Vlasenko wrote:
> On Mon, Jul 5, 2010 at 5:09 PM,<beebee at piments.com>  wrote:
>>>> Why does export not work ?
>>>
>>> Because you can't modify the parent process's environment variables.
>>> When you run /usr/local/bin/cron_delay.sh, you are creating a new
>>> process which executes /bin/sh (with the pathname of the script as its
>>> first argument).  That new process can modify it's own environment
>>> variables and pass them on to processes it creates, but it can't modify
>>> the environment of its parent process.  This is a standard unix feature,
>>> not a bug.
>>>
>>> It's possible to run the script within the current shell process
>>> (instead of spawning a new process) using the "source" or "." built-in
>>> shell command:
>>>
>>>   source /usr/local/bin/cron_delay.sh
>>>
>>> Since it's the current shell process that's running the commands in the
>>> script, any changes to environment variables will be in the current
>>> shell process, and will be passed on to any other processes created by
>>> the current shell process.
>>
>>   Ian, thanks for taking the time to explain so thoroughly my stupid mistake.
>>
>> However, it is not working using source. I reduced my cron job to simply
>> sourcing that script it fails to get called. Seeing no output form crond
>> generally indicates an error in crontab.
>>
>> I tried su to the relevent account and ran crontab -l.
>> $ crontab -l
>> crontab: must be suid to work properly
>>
>> I have noted the warning that suggests busybox may need to be suid but
>> hesitate since having just about any and all shell commands running suid
>> makes me a bit twitchy. Until now this has never produced an issue in what I
>> use this system for.
>
> busybox drops suid privileves for applets which do not need them.
> Only those with BB_SUID_REQUIRE in applets.h will retain the privileges.
>
>> There are certainly other ways to get around what I need to do what I need
>> but I don't like walking away from a problem just because I don't understand
>> what is happening.
>>
>> This seems like an awful lot of effort and problems just to set an env var !
>>
>> 01,16,31,46,25  * * * * source /usr/local/bin/cron_delay.sh
>
> No, this is wrong. "source" is a shell builtin, not a cron command.
>

Huh? The following line has been working for two years.

00,15,30,45 * * * * cd /www/apache/cgi-bin/ && gnuplot test.gnu

cd is BB as is the shell, what's the difference?



man cron gives the following example:

        5 4 * * sun     echo "run at 5 after 4 every sunday"

What do you mean by "not a cron command"?

> I don't understand what do you want to do. You want to set
> DELAY env var to 16 - *in which process*? In cron?
> That's not possible to do from a cron job.
>
> Cron job is a child of cron.
>
> A process can only change its own environment, and control
> what environment is passed to a newly created child.
> It can't change environment of another already
> running process (even if that process is its child).
>
> Can you describe a "bigger" problem you are trying to solve,
> since it looks like you are doing it all wrong.
>

Sorry if the the crontab was confusing. I made it as short as possible 
to test it. This is not the end objective !

The point is crond is not firing on this line. Usually I see something 
like the following on console each time crond triggers a crontab entry.

crond[324]: crond: USER .............

Nothing is happening at the time intervals I set in the line I posted. I 
have found this usually happens if there is an error in the crontab. 
Seeing nothing was happening I cut it down to the bare minimum to test 
using source.

The functionality I need to create is to pass a delay value to gnuplot. 
I have this working for a cgi responder that sets the env and calls 
gnuplot, but I can't get the crond end to work. The gnuplot script tests 
the value of DELAY to determine certain actions.

in essence I want something like this:

00,15,30,45 * * * * source /usr/local/bin/cron_plot_delay.sh &&  gnuplot 
test.gnu

I think using source should do it , my problem seems to be the crontab 
is not getting run.

At this stage I don't have an env var problem I have a crond problem.

Thanks again.



More information about the busybox mailing list