bgコマンドを使用した後、出力をnohupのようにリダイレクトできますか?

bgコマンドを使用した後、出力をnohupのようにリダイレクトできますか?

私が走るとき

apt-get -y upgrade

私は通常、次のような出力を表示します。

"the following packages will be upgraded..."

ctrl+zとを使用してbgプロセスをバックグラウンドに配置しますが、他のコマンドを実行してもその出力がstdoutに表示されます。

nohupバックグラウンドプロセス/コマンドの出力をこのようなファイルにリダイレクトできますか?

答え1

このアプローチは望ましくない。使用しないでください。システムが中断されても、すべての部分をそのまま維持できます。

いいね!まだ私と一緒にいますか?適切な include ( , for ) があるfcntl単純な場合にはopen(理論的に) 標準を他の場所にリダイレクトすることが可能です。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(void)
{
    while (1) {
        printf("blat\n");
        sleep(1);
    }
    exit(EXIT_SUCCESS);
}

コンパイルして実行します。

$ cc -g    blat.c   -o blat
$ ./blat &

他の端末で(さまざまな理由でセキュリティポリシー違反を実行できるライブプロセスに対してデバッガが実行できるアクションを考慮して)、バックグラウンドタスクに公開されたPIDを使用します。

$ gdb -q -p 3727
...
(gdb) call close(1)
$1 = 0

読んだ後close(2)成功したと確信しています。標準入力が終了しました。新しいファイルを開きましょう...

(gdb) call open("/home/userrunningblat/blat.out", O_CREAT|O_WRONLY, 0666)
No symbol "O_CREAT" in current context.

良いショットです。このシンボルが欠けているマジックナンバーは何ですか? 3番目のターミナルでは、ハンディを使用してくださいいくつかのCプログラムのコンパイルと実行:

$ cfu 'printf("%d\n", O_CREAT|O_WRONLY)'
65

あるいは、ディレクトリを直接掘り下げて/usr/include入力形式を調べてビットごとのORを実行することもできますが、これは非常に迷惑です。 (また、この数字はオペレーティングシステムによって異なり、実際には異なる場合があります。)戻るgdb

(gdb) call open("/home/userrunningblat/blat.out", 65, 0666)
$2 = 1
(gdb) quit
$ tail -f blat.out

1これは以前にstdout()を閉じたため、open(2)ファイル記述子番号は呼び出しで再利用されたため、終了後、gdb標準出力はそのファイルに移動する必要があります。

この方法は、より複雑なプログラムには適していない可能性があり、セキュリティの制限、デバッガ情報の不足、恐ろしい破損などによって不可能になる可能性があります。

関連情報