簡體   English   中英

如何檢查Perl腳本是否在終端中運行?

[英]How do I check if a Perl script is running in a terminal?

我試圖在Linux上的Perl腳本中確定它是否在終端中運行。

也就是說,我需要以下代碼:

  • 只需在命令行上運行即返回true
  • 運行./myscript.pl | less時也返回true ./myscript.pl | less甚至./myscript.pl </dev/null >/dev/null 2>/dev/null
  • 在cron作業中運行時返回false,或作為CGI腳本返回false

特別是因為第二個子彈,我不能使用-t STDOUT和變體,而且IO :: Interactive也沒用。

信息似乎確實可用。 如果我運行ps ,它會在TTY列中顯示類似pts/2的條目,即使我運行./myscript.pl </dev/null >/dev/null 2>/dev/null ,和? 作為cron作業或CGI腳本運行時。

有沒有一種優雅的方法來在Perl腳本中確定這個? 我寧願不必解析ps的輸出。

您可以嘗試打開/ dev / tty。 如果您在終端(即使在遠程計算機上的終端中),這將有效。 否則,如果腳本是通過at或cron運行的,則不會。

注意:這只適用於Unix系統。

我自己的問題的另一個答案。 我研究了ps源代碼,看看它是如何確定TTY的,它使用/proc/[pid]/stat

use strict;
use warnings;
use 5.010;
use autodie;

sub isatty()
{
    # See http://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html
    open(my $stat, '<', "/proc/$$/stat");
    if (<$stat> =~ m{^\d+\s+\(.*\)\s+\w\s+\d+\s+\d+\s+\d+\s+(\d+)}) {
        return $1 > 0;
    }
    else {
        die "Unexpected format in /proc/$$/stat";
    }
}

PS應該幫助你。
ps aux | grep 'filename.pl'

首先你必須檢查,輸出與-t相關聯。 當然如果你想,你可以查看/ proc / $ pid / fd / 1,它是設備的符號鏈接。 如果它是終端,你可以測試它。

但是如果還不夠,你可以通過%ENV特殊哈希表檢查環境變量。 CGI-BIN接口設置了其中一些。 如果你在cron下運行腳本,它會設置一些變量。 如果還不夠,可以在/ etc / crontab文件中設置它並在腳本中進行測試。 這是你的需要,你會做什么。

您應該只調用一次完整的過程。 你不能迭代它,因為腳本環境不會改變,直到它工作。

您不必調用任何外部命令,或者您不需要特殊的libarier。 只有你需要的是Windows不兼容。 但是如果你使用的是windows10,那么它的環境類似於基於ubuntu的linux。 然后你不能強烈地看,因為你在win32api和unix之類的系統之間做兼容。

為了部分回答我自己的問題,以下是訣竅:

sub isatty()
{
    my $tty = `/bin/ps -p $$ -o tty --no-headers`;
    $tty =~ s{[\s?]}{}g;
    return $tty;
}

返回TTY名稱(如果有)(如果為true),或者如果沒有則返回(false)。

我還是更喜歡沒有外部命令的解決方案......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM