件名:Linux上で動作するプログラムは、起動方法を知る必要があります。どうやってするか?Linuxプログラムは、どのように起動されたかを知ることができます:コマンドラインから?またはcronか他の何かによって?
ありがとうございます!
- ピート件名:Linux上で動作するプログラムは、起動方法を知る必要があります。どうやってするか?Linuxプログラムは、どのように起動されたかを知ることができます:コマンドラインから?またはcronか他の何かによって?
ありがとうございます!
- ピート通常、標準のファイル記述子の少なくとも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の中で仕事を開始します。)
プログラムの最初の引数は、通常、それを実行するために使用されるコマンドです。 bashで
例:
$ cat /tmp/argv0.sh
echo $0
$ bash /tmp/argv0.sh
/tmp/argv0.sh
$ cd /tmp/ && bash ./argv0.sh
./argv0.sh
を把握するために必要とされている実際には通常のcronので、私は... –
あなたはプログラムを開始したかを確認するには、親プロセス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.
をねえ、 をLinuxでは、すべてのUnixライクなシステムのように、各プロセスがありますinit-processの(子)-childです。 このコールツリーを表示するには、コマンドpsを使用します。さらに、出力オプションの
例えば:psの-ejHはあなたに素敵なコールツリーを与える
PSのmanページを表示します。
あなたは存在してはならない問題の解決策を探しているかもしれないと思います。プログラムは、それを誰が起動したかに関わらず、環境変数とコマンドラインスイッチを使用して、アプリケーションの予想される動作を変更することができます。
にはが必要な場合は、ps
コマンドを使用して何かをハッキングできる可能性がありますが、推奨しません。
「cron」で実行しているかどうかを知りたい場合は、親プロセスIDを取得してから、/ procを検索して親プロセス名を見つけることができます。例:
ここで私は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
卓越した機能することはないと思うのsh -cを使用してジョブを実行します!ありがとう。 –
ええ、それは標準的な方法である標準であることを見ています。 stdinがttyでない場合、多くのプログラムは(わずかに)動作が異なります。 – MarkR