Bagaimana cara memulai pekerjaan dalam keadaan berhenti?

2

Dalam bash, bagaimana saya bisa memulai pekerjaan dalam keadaan berhenti, seolah-olah saya memulainya secara normal dan kemudian segera menekan Ctrl-Z?

Atau seolah-olah saya telah mengirim SIGSTOP ke proses segera, tetapi tanpa memberikan proses untuk mengeksekusi sebelum menerima SIGSTOP.

nibot
sumber
Ya, ini duplikat yang tepat. Sayangnya pertanyaan lain juga belum dijawab untuk kepuasan saya.
nibot

Jawaban:

5

Anda dapat memulai subkulit baru, segera menghentikannya, dan kemudian (yaitu setelah menjalankannya lagi) jalankan perintah Anda. Saya menggunakan variabel $ BASHPID untuk mendapatkan PID dari subkulit, karena $$ masih mengembalikan PID dari induk:

( kill -SIGSTOP $BASHPID; exec my_command )

Menggunakan di execsini akan menyebabkan my_commandproses menggunakan PID yang sama dengan subkulit.

choroba
sumber
1
Ubah ( kill -SIGSTOP $BASHPID; exec my_command ) dan saya pikir kami punya pemenang!
nibot
4

Saya tahu pertanyaan ini cukup lama, tetapi kalau-kalau ada orang yang mencari fungsi ini, seperti saya:

Saya baru-baru ini menambahkan ini ke koleksi modul LD_PRELOAD saya ( https://github.com/zardus/preeny ). Menggunakan preeny, Anda dapat memiliki proses menangguhkan sendiri saat startup:

# https://github.com/zardus/preeny
# cd preeny
# make
# LD_PRELOAD=x86_64-linux-gnu/startstop.so /bin/echo TEST
[1]+  Stopped    LD_PRELOAD=x86_64-linux-gnu/startstop.so /bin/echo TEST
# fg
TEST

Preeny menunda proses selama startup perpustakaan, sebelum main()dipanggil.

Zardus
sumber
1
Hai Zardus, dan selamat datang di Pengguna Super. Jangan khawatir menjawab pertanyaan lama. Ini pendekatan yang menarik!
CVn
Pendekatan ini bagus, karena sebenarnya memuat biner. Namun, saya kira fungsi konstruktor lain dapat berjalan sebelum preeny.
user877329
Ya ... Sayangnya, saya belum menemukan cara untuk mengontrol urutan pelaksanaan konstruktor.
Zardus