При запуске из командной строки обычно, по крайней мере, один из стандартных файловых дескрипторов является терминалом, и даже если нет, обычно существует управляющий терминал.Обычно это не так при запуске из 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.)