Bashスクリプトを使用したプログラムの切り替え

Bashスクリプトを使用したプログラムの切り替え

これを切り替えることができるスクリプト(ナイトモードアプリ)を作成しようとしていますredshift。それで私はこうしました。

#!/bin/bash

pgrep redshift > /dev/null && \ 
         killall redshift || \
         setsid redshift [options] &> /dev/null

これにより、プログラムがバックグラウンドで実行されている場合は終了し、それ以外の場合は実行中になりますsetsid。このスクリプトはプロセスを終了すると機能しますが、もう一度実行するとスクリプトがハングします。

  • 私は何が間違っていましたか?
  • 端末を終了してもプログラムが停止しないようにプロセスをバックグラウンドに配置する他の方法はありますか?

ベストアンサー1

Bashを使用してプログラムを呼び出すと、Bashはそれを&>ユーザーが望むもの(バックグラウンド演算子とstdoutリダイレクト)ではなく、特別なリダイレクト演算子(stdoutとstderrの両方に&リダイレクト)として解釈します>。 2 つのタグを分離すると、予想されるバックグラウンド動作を得ることができます。

#!/bin/bash

pgrep redshift > /dev/null && 
  killall redshift || 
    setsid redshift [options] & > /dev/null

将来の自分にもっと親切に対処し、論理を少し拡張することを検討してください。それを殺したい場合は、redshiftいくつかのオプションを使用して実行してください。

if pgrep redshift > /dev/null
then
  pkill redshift
fi
setsid redshift options & > /dev/null 

おすすめ記事