GNU/Linux >> Belajar Linux >  >> Linux

Simulasikan Stdin Kosong ke Perintah Terpisah?

saya ingin melepaskan perintah baik dengan 'command &' di akhir, atau dengan 'nohup command &', tetapi berhenti tepat setelah melepaskannya.

perintah sedikit spesifik, jika menerima eof pada input, itu rusak sehingga /dev/null sebagai input akan mengarah ke akhir dan solusi yang biasanya berfungsi:

$ command < /dev/null > /dev/null 2>&1 &

tidak berfungsi…

apakah ada perangkat lain di unix/linux, yang dapat menggantikan /dev/null dan berperilaku seperti input kosong, tetapi tidak mengirim eof.

(omong-omong, perintah emcast alat multicasting sangat berguna, saya dapat mencoba menambalnya sendiri, atau menemukan versi yang ditambal untuk tujuan ini… tetapi tampaknya masalah itu dapat diselesaikan di luar)

Saya menambahkan EDIT ini untuk membuat pertanyaan saya lebih jelas. Saya membuat program C ini dari 2 baris yang berfungsi dengan sempurna:nama programnya adalah "donothing"

#include <unistd.h>
int main() {  while (1)  { sleep(10); } return 0; }

dan itulah yang saya cari, beberapa perangkat/program, yang tidak melakukan apa-apa, tetapi membiarkan stdoutnya terbuka. Keduanya (“command &… disown” dan “nohup command &”) berfungsi.

$ donothing | mycommand >/dev/null & 
$ disown %1

bekerja dengan baik, jadi sekarang pertanyaannya hanya:perangkat/program unix apa yang berperilaku seperti 'tidak melakukan apa-apa'.

Jawaban yang Diterima:

Agar perintah Anda mendeteksi eof , itu harus membaca dari stdin. Jadi mungkin itu mengharapkan beberapa masukan. Jadi sepertinya yang Anda butuhkan bukanlah input kosong (/dev/null memang dimaksudkan untuk itu), tetapi masukan yang tidak pernah datang.

Itu dapat disimulasikan dengan pipa di mana tidak ada yang akan menulis di ujung yang lain seperti:

sleep 999999999 | the-command

Atau untuk menghindari keharusan menjalankan sleep tambahan itu perintah, itu bisa dilakukan dengan pipa bernama:

fifo=$(mktemp -u) &&
  mkfifo "$fifo" &&
  (rm "$fifo" && the-command <&3 3<&- &) 3<> "$fifo"

Di sini menggunakan deskriptor file perantara untuk mengatasi fakta bahwa Shell menghubungkan stdin ke /dev/null secara implisit ketika Anda memulai perintah dengan & (kecuali jika Anda menambahkan pengalihan stdin eksplisit seperti <&3 . kami di sini).

Di Linux (dan mungkin hanya di Linux), Anda juga dapat melakukan:

the-command < /dev/fd/1 3>&1 > /dev/null | :

/dev/fd/1 di mana fd 1 terhubung ke pipa, di Linux, berperilaku seperti pipa bernama. Artinya, ketika Anda membukanya dalam mode baca, Anda mendapatkan ujung pembacaan pipa.

Jadi di atas, fd 0 akan dihubungkan ke ujung pembacaan pipa yang ujung lainnya ada di fd 3 dari the-command . Karena the-command tidak akan menulis apa pun di fd 3-nya, read any apa pun upaya pada fd 0 akan memblokir (atau pembacaan tanpa pemblokiran akan kembali dengan belum ada yang bisa dibaca , atau pilih/jajak pendapat akan mengembalikan tidak ada yang bisa dibaca baik sebagai the-command mungkin dilakukan jika melakukan hal lain selain menunggu masukan yang tidak pernah datang).

Terkait:Bagaimana cara mendapatkan pelengkapan otomatis gaya bash di zsh, (untuk perintah git)?
Linux
  1. Apa itu file /dev/zero dan /dev/null di Linux?

  2. Bagaimana cara menyandikan base64 /dev/random atau /dev/urandom?

  3. layar Tidak dapat membuka terminal Anda '/dev/pts/0' - harap periksa

  1. Kapan saya harus menggunakan /dev/shm/ dan kapan saya harus menggunakan /tmp/?

  2. Linux:Perbedaan antara /dev/console , /dev/tty dan /dev/tty0

  3. kernel:menonaktifkan /dev/kmem dan /dev/mem

  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. Bagaimana Linux menggunakan /dev/tty dan /dev/tty0

  3. Buat perangkat blok virtual yang menulis ke /dev/null