Linux

如何在 Linux 下啟動處於掛起狀態的程序?

  • May 14, 2021

實際上,我需要一個行為,就好像我Ctrl+Z在它開始後按下了一樣。

希望可以使用 shell 腳本來做這樣的事情。

(另外,知道得到的 PID 會很棒,所以我可以在之後繼續這個過程。)

啟動一個程序後,您可以向它發送 SIGSTOP 以暫停它。要恢復它,請發送 SIGCONT。我認為這個小腳本可以幫助你

#!/bin/bash
$@ &
PID=$!
kill -STOP $PID
echo $PID
wait $PID

它執行程序(命令作為參數發送),掛起它,列印程序 ID 並等待它結束。

您從哪個環境創建流程?

如果您是在 C 程式碼等環境中執行此操作,則可以 fork() 然後在子程序中,在 exec() 之前向自己發送 SIGSTOP,以防止進一步執行。

一個更通用的解決方案(可能是最好的)是創建一個這樣做的存根。所以存根程序將:

  • 獲取由真實程序的名稱和參數組成的參數
  • 向自身發送 SIGSTOP
  • exec() 帶有適當參數的真實程序

這將確保您避免任何與新處理有關的競爭條件在您向其發送信號之前變得太遠。


外殼範例:

#!/bin/bash
kill -STOP $$
exec "$@"

並使用上面的程式碼:

michael@challenger:~$ ./stopcall.sh ls -al stopcall.sh

[1]+  Stopped                 ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$ jobs -l
[1]+ 23143 Stopped (signal)        ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$ kill -CONT 23143; sleep 1
-rwxr-xr-x 1 michael users 36 2011-07-24 22:48 stopcall.sh
[1]+  Done                    ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$ 

顯示jobs -lPID。但是,如果您是從 shell 執行此操作,則不需要直接使用 PID。你可以這樣做:(kill -CONT %1假設你只有一份工作)。

做不止一份工作?留給讀者作為練習:)

引用自:https://serverfault.com/questions/293632