私が走るとき
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
標準出力はそのファイルに移動する必要があります。
この方法は、より複雑なプログラムには適していない可能性があり、セキュリティの制限、デバッガ情報の不足、恐ろしい破損などによって不可能になる可能性があります。