GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara memulai proses dalam grup prosesnya sendiri?

Apa maksud Anda "memulai proses dalam grup prosesnya sendiri"? Shell meluncurkan proses dalam grup prosesnya sendiri, begitulah cara kerjanya mengontrol (dengan memiliki grup proses untuk proses di latar depan, dan beberapa grup proses untuk setiap pipeline yang diluncurkan di latar belakang).

Untuk melihat bahwa shell meluncurkan grup proses baru untuk setiap pipeline, Anda dapat melakukan ini:

ps fax -o pid,pgid,cmd | less

yang akan menampilkan sesuatu seperti:

11816 11816  |   \_ /bin/bash
4759   4759  |       \_ ps fax -o pid,pgid,cmd
4760   4759  |       \_ less

Perhatikan bahwa shell telah membuat grup proses baru untuk pipeline, dan setiap proses dalam pipeline membagikan grup proses tersebut.

Sunting:

Saya pikir saya tahu apa yang Anda maksud. Anda memanggil system dari Perl. Rupanya, sh -c tidak membuat grup proses baru, karena merupakan shell tanpa kontrol tugas.

Apa yang akan saya lakukan adalah fork , lalu pada anak:

setpgrp;
system("ps fax -o pid,pgid,cmd");

dan wait pada orang tua.


EDIT:Jika yang ingin Anda lakukan adalah menggunakan setsid tetapi temukan id sesi dan/atau pid dari proses yang dihasilkan:

Jika Anda meluncurkan proses melalui perintah setsid, itu tidak akan dilampirkan ke terminal Anda, jadi tentu saja itu tidak akan merespons ctrl-c.

Anda dapat menemukannya dengan melihat melalui keluaran

ps x -O sid 

atau sesuatu yang lebih terbatas seperti

ps x -o %c,%p,sid

Atau trolling sederhana melalui proc/[pid]/stat untuk semua entri dan melihat id sesi dan apa pun yang menarik (lihat man proc untuk detailnya)

Halaman manual untuk setsid tidak memberikan flag apa pun untuk menghasilkan keluaran secara langsung, tetapi Anda dapat dengan mudah membuat versi Anda sendiri yang mencetak informasi yang diinginkan, dengan memodifikasi standar.

Misalnya, ambil salinan setsid.c dari salah satu hasil untuk

http://www.google.com/codesearch?as_q=setsid&as_package=util-linux

Komentari nls termasuk, hal-hal lokal dan makro kesalahan _("") yang akan menyebabkan masalah dan kemudian tambahkan ini tepat sebelum baris execvp:

    printf("process will be pid %d sid %d\n", getpid(), getsid(0));

Linux
  1. Bagaimana cara mendapatkan waktu mulai dari proses Linux yang sudah berjalan lama?

  2. Bagaimana cara mendapatkan ps untuk mencetak grup?

  3. Bagaimana cara mengompres banyak folder, masing-masing ke dalam arsip zipnya sendiri?

  1. Cara mematikan proses zombie di Linux

  2. Bagaimana PulseAudio dimulai?

  3. Linux - Bagaimana saya melihat kapan suatu proses dimulai?

  1. Cara menginstal vtop di Linux

  2. Bagaimana Proses Latar Belakang Mengetahui Pidnya Sendiri?

  3. Bagaimana cara menjalankan server web Golang saya di latar belakang?