主题说明了一切:在Linux下运行的程序需要知道它是如何启动的。怎么做?
谢谢!
- 皮特
答案 0 :(得分:3)
当在命令行运行时,通常至少有一个标准文件描述符是终端,即使没有,通常也存在一个控制终端。从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内开始你的工作。)
答案 1 :(得分:2)
我认为您可能正在寻找一个不应该存在的问题的解决方案。一个程序不应该关心谁发起它。您可以使用环境变量和命令行开关来更改应用程序的预期行为。
如果您必须知道如何启动应用程序,您可以使用ps
命令一起破解某些内容,但我不推荐它。
答案 2 :(得分:1)
程序的第一个参数通常是用于运行它的命令。
bash中的示例:
$ cat /tmp/argv0.sh
echo $0
$ bash /tmp/argv0.sh
/tmp/argv0.sh
$ cd /tmp/ && bash ./argv0.sh
./argv0.sh
答案 3 :(得分:1)
您可以获取父进程标识符以查看启动该程序的内容。如果程序是从cron调用的,你可以通过PID将进程表传递给cron和cron本身分叉的shell:
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.
答案 4 :(得分:1)
嘿 在Linux中,就像在每个类似Unix的系统中一样,每个进程都是init进程的(子) - 子进程。 要查看此调用树,只需使用命令ps。
例如:ps -ejH为您提供了一个很好的调用树
进一步输出选项查看ps的手册页。
答案 5 :(得分:1)
如果你真的想知道你是否在“cron”下运行,你可以得到你的父进程id,然后查看/ proc以找到父进程名。例如:
#!/bin/sh
PARENT_PID=`ps -p $$ -o ppid=`
PARENT_CMD=`cat /proc/$PARENT_PID/cmdline`
echo "parent = $PARENT_PID $PARENT_CMD"
答案 6 :(得分:-1)
这是我用来确定cron,at和交互式会话中进程的父级的内容。出于某种原因,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