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).