Secara praktis, saya membutuhkan proses yang berperilaku, seolah-olah saya telah menekan Ctrl+Z
tepat setelah itu dimulai.
Semoga bisa melakukan hal seperti itu menggunakan skrip shell.
(Juga, mengetahui PID yang dihasilkan akan bagus, jadi saya bisa melanjutkan proses setelah itu.)
linux
process
background-process
java.is.for.desktop
sumber
sumber
#!/bin/bash
[enter]$@ &
[enter]PID=$!
[enter]kill -STOP $PID
[enter]echo "Suspended: $PID, press ENTER to continue it"
[enter]read
[enter]kill -CONT $PID
[enter]wait $PID
[enter]echo
Dari lingkungan mana Anda membuat proses?
Jika Anda melakukannya dari lingkungan seperti kode C, Anda dapat melakukan fork () dan kemudian pada child, mengirim SIGSTOP ke diri Anda sendiri sebelum exec (), mencegah eksekusi lebih lanjut.
Solusi yang lebih umum (mungkin yang terbaik) adalah dengan membuat rintisan. Jadi program rintisan akan:
Ini akan memastikan bahwa Anda menghindari segala jenis kondisi balapan yang berkaitan dengan pemrosesan baru terlalu jauh sebelum Anda dapat mengirim sinyal ke sana.
Contoh untuk shell:
Dan menggunakan kodez di atas:
The
jobs -l
menunjukkan PID. Tetapi jika Anda melakukannya dari shell Anda tidak perlu PID secara langsung. Anda cukup melakukan:kill -CONT %1
(dengan asumsi Anda hanya memiliki satu pekerjaan).Melakukannya dengan lebih dari satu pekerjaan? Ditinggalkan sebagai latihan untuk pembaca :)
sumber
Jawaban MikeyB benar. Dari pertanyaan tentang superuser ini, inilah versi yang lebih ringkas:
Untuk memahami ini, kita perlu memahami bagaimana proses dimulai pada unix:
exec
panggilan sistem menggantikan program yang sedang berjalan dengan yang baru , menjaga PID yang ada. Jadi cara proses independen dibuat adalah untuk pertamafork
, dan kemudianexec
, mengganti program yang sedang berjalan dalam proses anak dengan program yang diinginkan.Bahan dari perintah shell ini adalah:
(...)
memulai sub-shell: contoh lain dari BASH.kill
perintah mengirimkan sinyal STOP untuk proses ini, yang menempatkan ke negara ditangguhkan.CONT
sinyal),exec
perintah menyebabkannya untuk mengganti sendiri dengan program yang Anda inginkan.my_command
menyimpan PID asli dari sub-shell.$!
variabel untuk mendapatkan PID dari proses.sumber
-s STOP
bukan-SIGSTOP
). Masih bertanya-tanya: mengapa harus$BASHPID
bukannya$$
? (Saya mungkin tidak benar-benar mengerti perbedaannya).$$
vs$BASHPID
, saya periksa yang terakhir adalah PID dari sub-shell, sementara bukan yang pertama. Ada masalah lucu: menerapkan tip dalam skrip bash, paling sering gagal, dan saya harus melakukan sesuatu seperti ini:PID=$!; ps -p $PID; kill -s CONT $PID;
... gagal jika saya menghapusps -p $PID
bagian: prosesnya tampaknya menghilang (terbunuh?) Tanpa pesan kesalahan di mana pun . Tidak apa-apa dari shell interaktif, masalahnya hanya dari skrip. Itu terlalu misterius.$BASHPID
shell selain bash, lihat di sini