help-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

CWD of job-monitored subprocess


From: Steffen Nurpmeso
Subject: CWD of job-monitored subprocess
Date: Sat, 22 Jan 2022 23:49:29 +0100
User-agent: s-nail v14.9.23-223-g046972b06d

Hello.

Some time back i struggled with a problem and just now wondered
whether anyone has an approach to deal with the problem.

For long i use some shell functions to listen to music, but one
day i opened the lid of my laptop and found that one encfs
filesystem has not been unmounted on lid close, and that has been
because i thoughtlessly started playing some music while my CWD
was down in one of its directories.

So i rewrote those functions, but it turns out to be an
impossibility in job-monitored subprocesses, because some
intermediate shell environment still keeps the CWD where we
started going.

So for example MP4/AAC files i now play via

      mp4play() (
         __r_d_b_x__ y "${@}"
         eval "${__x__} faad -q -w \"${__r__}\" |\
            sox -q -t raw -r 44100 -c 2 -b 16 -e signed-integer - -t alsa"
      )
      mp4playq() {
         #set -m
         (
         __r_d_b_x__ y "${@}"
         eval "${__x__} faad -q -w \"${__r__}\" |\
            sox -q -t raw -r 44100 -c 2 -b 16 -e signed-integer - -t alsa"
         ) &
      }

Where *q() is just "silent, immediately in the background".
The helper is now (it digs -==stdin and can seek input forward)

      __r_d_b_x__() {
         [ "${#}" -lt 2 ] && exit 64
         if [ "${2}" = - ]; then
            [ "${1}" != y ] && exit 64
            __r__=- __d__=- __b__=-
         else
            __r__=$(realpath "${2}")
            __d__=$(dirname "${__r__}")
            __b__=$(basename "${__r__}")
         fi

         __x__=
         if [ "${1}" = y ] && [ ${#} -gt 2 ]; then
            if [ "${__r__}" != - ]; then
               exec 5<&0 <"${__r__}"
               __r__=-
            fi
            dd skip=${3} ibs=1 count=0 2>/dev/null
            __x__='cat |'
         fi

         cd /
      }

So the helper cd(1)s to / in order to change the CWD of the
actually running subprocess.  However, one may see

  [1]+  Stopped                 ( __r_d_b_x__ y "${@}"; eval "${__x__} faad -q 
-w \"${__r__}\" |            sox -q -t raw -r 44100 -c 2 -b 16 -e 
signed-integer - -t alsa" )  (wd: /usr/ports/core)
  (wd now: ~/sec.arena/configs.git/home)

So the wd: of the actual music job is not / but /usr/ports/core.
I then gave up, thinking all i could do is temporily switch the
shell's CWD as such to /, start the subprocess, and then go back,
no problem no more now that the helper uses that super expensive
realpath, dirname, basename .. for nothing :), but the will to do
it was gone, as the problem normally does not occur.

Howver, maybe someone knows a better approach to make the
supervising shell move away?  I mean, it must have held some
reference, otherwise the filesystem would have been unmounted?

Ciao from Germany,

--steffen
|
|Der Kragenbaer,                The moon bear,
|der holt sich munter           he cheerfully and one by one
|einen nach dem anderen runter  wa.ks himself off
|(By Robert Gernhardt)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]