determine if the script has been invoked manually or not?

Hi,

Is there a way to determine if the script has been invoked manually or not( might be invoked by a schedular or crontab)?

Thanks,

This is only a heuristic.

Within your script see if you have the env variable TERM available or not.

If the script is run manually, then you would need some kind of terminal to invoke it from. If it is run from a crontab, it would not require a terminal (atleast thats what I think).

Check it out.

You can check if the process is associated/connected to terminal.
For example this is with lsof on Linux:

Note the terminal devices (pts):

$ lsof -p 10716
COMMAND   PID   USER   FD   TYPE DEVICE     SIZE   NODE NAME
bash    10716 oracle  cwd    DIR  72,17     4096  32705 /app/oracle
bash    10716 oracle  rtd    DIR  253,0     4096      2 /
bash    10716 oracle  txt    REG  253,0   616248 393573 /bin/bash
bash    10716 oracle  mem    REG  253,0    45889 491876 /lib/libnss_files-2.3.4.so
bash    10716 oracle  mem    REG  253,0   106397 491564 /lib/ld-2.3.4.so
bash    10716 oracle  mem    REG  253,0  1454802 229472 /lib/tls/libc-2.3.4.so
bash    10716 oracle  mem    REG  253,0    15324 491856 /lib/libdl-2.3.4.so
bash    10716 oracle  mem    REG  253,0    12592 491892 /lib/libtermcap.so.2.0.8
bash    10716 oracle  mem    REG  253,0    21544 262456 /usr/lib/gconv/gconv-modules.cache
bash    10716 oracle  mem    REG  253,0 48504432 132692 /usr/lib/locale/locale-archive
bash    10716 oracle    0u   CHR  136,2               4 /dev/pts/2
bash    10716 oracle    1u   CHR  136,2               4 /dev/pts/2
bash    10716 oracle    2u   CHR  136,2               4 /dev/pts/2
bash    10716 oracle  255u   CHR  136,2               4 /dev/pts/2

This is from cron:

$ lsof -p 10673
COMMAND   PID   USER   FD   TYPE DEVICE    SIZE   NODE NAME
sleep   10673 oracle  cwd    DIR  72,17    4096  32705 /app/oracle
sleep   10673 oracle  rtd    DIR  253,0    4096      2 /
sleep   10673 oracle  txt    REG  253,0   17340 394503 /bin/sleep
sleep   10673 oracle  mem    REG  253,0   93985 229474 /lib/tls/libpthread-2.3.4.so
sleep   10673 oracle  mem    REG  253,0   47671 232047 /lib/tls/librt-2.3.4.so
sleep   10673 oracle  mem    REG  253,0  106397 491564 /lib/ld-2.3.4.so
sleep   10673 oracle  mem    REG  253,0 1454802 229472 /lib/tls/libc-2.3.4.so
sleep   10673 oracle  mem    REG  253,0  178019 229504 /lib/tls/libm-2.3.4.so
sleep   10673 oracle    0r  FIFO    0,7         267166 pipe
sleep   10673 oracle    1w  FIFO    0,7         267167 pipe
sleep   10673 oracle    2w  FIFO    0,7         267167 pipe

On Solaris with ptree:

$ ptree 29948
514   /usr/sbin/cron
  29939 sh -c /app/oracle/admin/xxxx/xxxxxx.ksh
    29948 /bin/ksh /app/oracle/admin/xxxx/xxxxxx.ksh
      72    ftp -i -n -v

You can play with pstree, strace (Linux), ptree, pfiles, truss (Solaris) as well.
And of course, I suppose there will be special cases.

Hi.

I usually use the very old command tty. This script creates a little shell script that demonstrates tty. It calls the created script directly, and then runs it as an "at" job. The results of at jobs are mailed to you.

#!/bin/sh

# @(#) s1       Demonstrate tty.

echo " sh version: $BASH_VERSION"

cat >test-tty.sh <<EOF
#!/bin/sh

if tty -s
then
        echo " STDIN is connected to a terminal."
else
        echo " STDIN is NOT connected to a terminal."
fi
EOF

echo
chmod +x test-tty.sh
./test-tty.sh

echo
at -f ./test-tty.sh now

exit 0

Which, when run, produces:

% ./s1
 sh version: 2.05b.0(1)-release

 STDIN is connected to a terminal.

warning: commands will be executed using /bin/sh
job 14 at 2007-05-14 06:52

and here is the email message:

From drl@leap  Mon May 14 06:52:58 2007
Subject: Output from your job       14
To: drl@leap
Date: Mon, 14 May 2007 06:52:58 -0500 (CDT)
Status: R

 STDIN is NOT connected to a terminal

See man tty for details ... cheers, drl

I use this paradigm:

#!/bin/ksh
# determine if there's a controlling tty for this run of the script.
# if there's none, it means we're running from 'cron' 
if [ -t 0 ] ; then
   inputTERM="I have a controlling terminal => I ain't from cron"
fi;

May be I misread the question,
I thougth the OP wanted to check from the outside.

There's only one way to find out, ain't it - that is if the OP follows up with his/her/its postings!

Hi.

A useful lesson on asking good questions and writing good requirements ... cheers, drl

is there any way to actually get the cron job's output onto a tty...can piping to /dev/tty help?