簡體   English   中英

如何殺死所有沒有pid 12345的名為“ shairport”的進程

[英]How to kill all processes named “shairport” that do not have the pid 12345

我在工作中使用Shairport播放音樂。 我在Debian機器(樹莓派)上運行它。 在其/etc/init.d/shairport文件中,僅包含start | stop命令。 我想添加一個重啟。 這是到目前為止的代碼:

case "$1" in
  restart)
    service shairport stop
    service shairport start
    ;;
  start)
    /usr/local/bin/shairport -d -a "$NAME" -p 5002 -k "madafaka" -w -B "mpc stop"
    ;;
  stop)
    killall shairport
    ;;
  *)
    echo "Usage: /etc/init.d/shairport {start|stop|restart}"
    exit 1
    ;;
esac

exit 0

問題是,當我運行“ service shairport restart”時,該服務將停止,從而運行“ killall shairport”並殺死bash腳本進程本身。 因此,永遠不會執行“開始”。

我如何使killall殺死除當前腳本以外的所有shairport?

我的想法是獲取pid並將其排除,但我找不到解決方法。

起始部分應記下已啟動過程的PID。 echo $? > /var/run/shairport.pid echo $? > /var/run/shairport.pid

停止腳本的一部分將使用我們創建的.pid文件中的PID,並終止正確的進程。 據我所知,大多數Linux服務都是這樣做的。

在Linux中,您可以使用$ $$知道腳本文件在其下運行的進程ID。

您只需要檢查您是否沒有殺死自己:

stop)
for pid in $(pgrep shairport); do
    if[$pid != $$]
        kill $pid
    fi
done

由於我選擇的答案無法直接使用,因此以下是我最終得到的代碼:

case "$1" in
  restart)
    for pid in $(pgrep shairport); do
            if [ "$pid" != $$ ]; then
                kill $pid
            fi
    done
    /usr/local/bin/shairport -d -a "$NAME" -p 5002 -k "madafaka" -w -B "mpc stop"
    ;;
  start)
    /usr/local/bin/shairport -d -a "$NAME" -p 5002 -k "madafaka" -w -B "mpc stop"
    ;;
  stop)
        killall shairport
    ;;
  *)
    echo "Usage: /etc/init.d/shairport {start|stop|restart}"
    exit 1
    ;;
esac

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM