Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/11/2013, à 15:10

k3c

[Résolu]Python/ Comment trouver la ligne de commande d'un sous-process

Bonjour

J'ai posté dans trucs astuces et scripts utiles un script qui "enrobe" des commandes get_iplayer pour télécharger des replays de la BBC.

Je voudrais améliorer ce script, et garder la ligne de commande qui fait le boulot, une grosse commande rtmpdump, par exemple dans ce cas

rtmpdump --port 1935 --protocol 0 --playpath mp4:iplayerstream/secure_auth/800kbps/modav/bUnknown-b03hdm2k_b03hdm2k_1384031252426.mp4 --host bbcmedia.fcod.llnwd.net --swfVfy http://www.bbc.co.uk/emp/revisions/18269_21576_10player.swf?revision=18269_21576 --tcUrl rtmp://bbcmedia.fcod.llnwd.net:1935/a1414/e3?as=adobe-hmac-sha256&av=1&te=connect&mp=iplayerstream/secure_auth/800kbps/modav/bUnknown-b03hdm2k_b03hdm2k_1384031252426.mp4&et=1384642956&fmta-token=99b6b26e3d50ca8026a1cd46d0d484879ed34974cbc06647c41e716004575787 --app a1414/e3?as=adobe-hmac-sha256&av=1&te=connect&mp=iplayerstream/secure_auth/800kbps/modav/bUnknown-b03hdm2k_b03hdm2k_1384031252426.mp4&et=1384642956&fmta-token=99b6b26e3d50ca8026a1cd46d0d484879ed34974cbc06647c41e716004575787 --pageUrl http://www.bbc.co.uk/iplayer/episode/b03hdm57/Inspector_Montalbano_Series_3_A_Ray_of_Light/ --swfVfy http://www.bbc.co.uk/emp/releases/iplayer/revisions/617463_618125_4/617463_618125_4_emp.swf --resume -o /home/gg/bbc1/Inspector_Montalbano_Series_3_-_4._A_Ray_of_Light_b03hdm57_default.partial.mp4.flv --timeout 10

par exemple pendant un téléchargement, j'ai 2 process, get_iplayer et rtmpdump

gg        3615  3538  0 22:02 pts/3    00:00:00 /usr/bin/perl /usr/bin/get_iplayer --get 370 --nopurge --subtitles -p http://88.150.181.202:3128
gg        3623  3615  0 22:02 pts/3    00:00:00 rtmpdump --port 1935 --protocol 0 --playpath mp4:iplayerstream/secure_auth/800kbps/modav/bUnknown-b03hdm2k_b03hdm2k_1384
root      3627     2  0 22:04 ?        00:00:00 [kworker/0:1]
gg        3628  3316  0 22:04 pts/4    00:00:00 ps -ef

Comme pour beaucoup de replays, la vidéo reste disponible longtemps si on a la bonne commande, et vu qu'ici on s'embête à tester différents proxys avant d'en trouver un qui marche, ça vaut vraiment le coup de garder cette commande, par exemple si un problème réseau interrompt le téléchargement.

On voit donc que le process qui fait le boulot, le rtmpdump, est un fils du process get_iplayer.

Donc je voudrais récupérer la ligne de commande de ce process, sachant que je veux vraiment le process fils du get_iplayer, vu que je peux avoir n process qui font du rtmpdump (qarte, captvty, script divers de la RTS...)

Si quelqu'un a un script qui fait cela, je suis intéressé.

Merci

Dernière modification par k3c (Le 20/11/2013, à 06:56)


Archlinux sur Xiaomi Air 13

Hors ligne

#2 Le 17/11/2013, à 15:55

darunia_goron

Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process

Essaie :

ps --no-header --ppid LE_PID_DE_GET_IPLAYER

Tu peux aussi jouer avec l'option -o de la commande ps pour formater la sortie.
Par exemple :

ps --no-header --ppid LE_PID_DE_GET_IPLAYER -o pid,args

pour afficher uniquement les PIDs et commandes (avec arguments) des fils.

Dernière modification par darunia_goron (Le 17/11/2013, à 16:05)

Hors ligne

#3 Le 17/11/2013, à 16:15

k3c

Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process

Merci, je vais essayer, je pensais à du code Python, mais je peux lancer cette commande-là dans un script Python.

:-)


Archlinux sur Xiaomi Air 13

Hors ligne

#4 Le 17/11/2013, à 16:23

darunia_goron

Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process

Je ne connais pas Python mais vu que j'ai une commande qui fait le travail, je me suis permis de répondre.


Un petit oubli de ma part : utilise ww pour enlever les limites de taille de la sortie :

$ ps ww --no-header --ppid LE_PID_DE_GET_IPLAYER

Si ww est omis, la taille maximale est non spécifiée dans le cas où la sortie est redirigée et tu risques de te retrouver avec un nom de commande tronqué.

Hors ligne

#5 Le 17/11/2013, à 16:31

k3c

Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process

merci, donc finalement

ps ww --no-header --ppid pid_de_get_iplayer -o args

fait le boulot en bash.

Reste juste à le traduire en Python.

Merci encore


Archlinux sur Xiaomi Air 13

Hors ligne

#6 Le 18/11/2013, à 08:20

grim7reaper

Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process

Salut,

Pour cela, tu peux utiliser les info’ disponibles dans le procfs (ps se base dessus, sur Linux du moins).
L’info que tu cherches est dans le fichier /proc/[pid]/cmdline.

man 5 procfs a écrit :

This  holds the complete command line for the process, unless the process is a zombie.  In the latter case, there is nothing in this file: that is, a read on this file will return 0 characters.  The command-line arguments appear in this file as a set of strings separated by null bytes ('\0'),  with a further null byte after the last string.

Donc du coup, il te suffire de lire le fichier, virer le null byte terminal et remplacer les autres par des espaces pour obtenir ta ligne de commande :

>>> with open('/proc/1076/cmdline') as src:
>>>     cmdline = src.readline()[:-1].replace('\x00', ' ')
>>> cmdline
/usr/bin/dbus-daemon --fork --print-pid 6 --print-address 8 --config-file /usr/share/fcitx/dbus/daemon.conf

Hors ligne

#7 Le 18/11/2013, à 10:23

k3c

Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process

@ grim7reaper

Excellent !

Il me reste à trouver le pid du petit fils, vu que mon script Python lance une commande get_iplayer qui lance le rtmpdump
Et donner au fichier le nom de l'épisode, du genre
Ambassadors_s1_e03.sh

Je teste ce soir


Archlinux sur Xiaomi Air 13

Hors ligne

#8 Le 18/11/2013, à 22:03

k3c

Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process

Bon, si

        process = subprocess.Popen(arguments, stdout=subprocess.PIPE, stderr=sub
process.PIPE)
        pid = process.pid

récupère bien le pid voulu, comme la commande suivante (le get_iplayer) est du Perl, pas de moi, je crois que je vais lancer un bête bash qui fera le boulot.

Merci à tous

Edit : il faut surtout que je re-écrive en Python juste les 2 parties de get_iplayer qui m'intéressent
1) la recherche
get_iplayer cagney
va trouver la série Cagney et Lacey
et montrer qu'il a un identifiant 691 par exemple

2) le téléchargement
get_iplayer --get 691
va télécharger cette vidéo

Si un bon connaisseur de Perl veut m'aider sur ce coup, il est le bienvenu

Dernière modification par k3c (Le 18/11/2013, à 22:50)


Archlinux sur Xiaomi Air 13

Hors ligne

#9 Le 20/11/2013, à 06:16

grim7reaper

Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process

k3c a écrit :

Si un bon connaisseur de Perl veut m'aider sur ce coup, il est le bienvenu

Je pense que tu auras plus de chance d’avoir des réponses en ouvrant un autre sujet avec un titre adapté (et tu pourras passer celui-ci en résolu) wink

Hors ligne

#10 Le 20/11/2013, à 06:55

k3c

Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process

Tu as raison, mais ce n'est plus la peine, j'ai trouvé une version en Python de get_iplayer
xbmc-iplayer-plugin
Je vais repartir de ce code-là.


Archlinux sur Xiaomi Air 13

Hors ligne