2011-01-27 13 views

答えて

3

通常、標準のファイル記述子の少なくとも1つは端末であり、通常は少なくとも1つは端末であり、そうでない場合でも通常は制御端末が存在します。これは、通常cronから実行した場合は当てはまりません。

if (isatty(STDIN_FILENO) || isatty(STDOUT_FILENO) || isatty(STDERR_FILENO)) 
    puts("One of my standard file descriptors is a terminal"); 

int fd = open("/dev/tty", O_RDWR); 
if (fd != -1) { 
    puts("I have a controlling terminal"); 
    close(fd); 
} 

環境などの相違点もありますが、信頼できるものはありません。 (getppidのソリューションでさえ、必ずしも機能しません。つまり、cronはおそらくshの中で仕事を開始します。)

+0

卓越した機能することはないと思うのsh -cを使用してジョブを実行します!ありがとう。 –

+0

ええ、それは標準的な方法である標準であることを見ています。 stdinがttyでない場合、多くのプログラムは(わずかに)動作が異なります。 – MarkR

1

プログラムの最初の引数は、通常、それを実行するために使用されるコマンドです。 bashで

例:

$ cat /tmp/argv0.sh 
echo $0 
$ bash /tmp/argv0.sh 
/tmp/argv0.sh 
$ cd /tmp/ && bash ./argv0.sh 
./argv0.sh 
+0

を把握するために必要とされている実際には通常のcronので、私は... –

1

あなたはプログラムを開始したかを確認するには、親プロセスIDを取得することができます。プログラムはcronで呼び出された場合、あなたは自分自身をcronのことでフォークシェルにPIDを介してプロセステーブルを歩くとcronができます

getppid(3) - Linux man page 

Name 

getppid - get the parent process ID 

Synopsis 

#include <unistd.h> 

pid_t getppid(void); 

Description 

The getppid() function shall return the parent process ID of the calling process. 

Return Value 

The getppid() function shall always be successful and no return value is reserved to indicate an error. 
1

をねえ、 をLinuxでは、すべてのUnixライクなシステムのように、各プロセスがありますinit-processの(子)-childです。 このコールツリーを表示するには、コマンドpsを使用します。さらに、出力オプションの

例えば:psの-ejHはあなたに素敵なコールツリーを与える

PSのmanページを表示します。

2

あなたは存在してはならない問題の解決策を探しているかもしれないと思います。プログラムは、それを誰が起動したかに関わらず、環境変数とコマンドラインスイッチを使用して、アプリケーションの予想される動作を変更することができます。

にはが必要な場合は、psコマンドを使用して何かをハッキングできる可能性がありますが、推奨しません。

1

「cron」で実行しているかどうかを知りたい場合は、親プロセスIDを取得してから、/ procを検索して親プロセス名を見つけることができます。例:

-1

ここで私はcron、at、およびinteractiveセッションの中でプロセスの親を判断するために使用します。何らかの理由でcronがpsで表示されますが、表示されません。プロセスツリーに表示されますが、cronは表示されません。したがって、いくつかのテストは、親

#!/bin/sh - 

SESSION_ID=$(ps -j h $$ | awk '{print $3}')   # Get session id 
# look for atd in the process table 
PS=$(ps -s $SESSION_ID | sed -n '/atd/p' | sed -e '1q') 
[ -n "$PS" ] && PARENT='AT daemon'    # if found 

# look for CRON in the process table 
PS=$(ps aux | grep $PPID | grep -v grep | grep CRON) 
[ -n "$PS" ] && PARENT='CRON daemon'   # if found 

# look for the tty in the process table 
TTY=$(ps -j h $$ | awk '{print $4}') 
[ "$TTY" == '?' ] || PARENT='Interactive shell'  # if found 
関連する問題